Unvollständige Typunterschrift

Nehmen wir an, wir haben eine Funktion wie f unten, die eine Monade zurückgibt. Wo Sie jedoch sehenIntStell dir vor, es ist ein wirklich komplizierter Typ.

f :: (Monad m) => m Int -- Pretend this isn't Int but something complicated
f = return 42

Nehmen wir nun an, wir wollen dies in die erzwingenMaybe Monade. Wir müssen nicht den ganzen Typ schreibenf Dazu können wir einfach Folgendes tun:

g :: Maybe a -> Maybe a
g = id

main = print $ (g f)

Die Dummy-Funktiong Kräftef werdenMaybe.

Ich finde das obige ziemlich chaotisch. Was ich lieber schreibe, ist Folgendes:

main = print $ (f :: Maybe a)

Es schlägt jedoch mit folgendem Fehler fehl:

Couldn't match expected type `a' against inferred type `Int'
  `a' is a rigid type variable bound by
      the polymorphic type `forall a. Maybe a' at prog.hs:7:16
  Expected type: Maybe a
  Inferred type: Maybe Int
In the second argument of `($)', namely `(f :: Maybe a)'
In the expression: print $ (f :: Maybe a)

Gibt es einen Weg, was zu tung geht das in einer weniger chaotischen Art und Weise, bei der keine neue Funktion erstellt wird? Ich will nicht schreibenf :: Maybe Int, da es zu einem Wartungsproblem kommt, wenn sich der Rückgabetyp ändert. GHC-Erweiterungen sind in Antworten in Ordnung.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage