Unvollständige Typunterschrift
Nehmen wir an, wir haben eine Funktion wie f unten, die eine Monade zurückgibt. Wo Sie jedoch sehenInt
Stell 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.