2015-05-11 15 views
12

In Haskell, warum Typ-Signatur von foreverHaskell `forever` Art Signatur

forever :: Monad m => m a -> m b 

Insbesondere, warum ist es nicht nur :: Monad m => m a -> m a? Sicherlich die Art von Monade, auf die wir handeln, ändert sich nicht auf halbem Weg forever?

Eine Funktion wie:

forever' :: Monad m => m a -> m a 
forever' = forever 

scheint genau das gleiche zu arbeiten.

+1

Die Art der Monade ist 'm' und es ändert sich nicht:

Prelude> let forever m = let x = m >> x in x Prelude> :t forever forever :: Monad m => m a -> m b 

In diesen Tagen sollte es wohl anders definiert werden. Was sich ändert, ist der Ergebnistyp "b". –

Antwort

14

Die Typensignatur von forever ist so konzipiert, dass das Ergebnis für immer fortlaufend ist. Insbesondere gibt es keine Möglichkeit, eine Aktion vom Typ m b (polymorph in ihrem Rückgabewert) zu schreiben, die endet und einen Nicht-Grundwert liefert. Eine alternative Möglichkeit, dasselbe zu empfehlen, wäre forever' :: m a -> m Void.

Eine andere Antwort ist, einfach zu sagen, dass dies der allgemeinste Typ ist, der für die Funktion verfügbar ist, wie sie definiert ist, also ist es diejenige, die sie gegeben hat.

forever :: Applicative f => f a -> f b 
forever a = let x = a *> x in x 
Verwandte Themen