2015-05-11 16 views
12

In Haskell perché è di tipo-firma di foreverHaskell `tipo di firma forever`

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

particolare perché non è solo :: Monad m => m a -> m a? Sicuramente il tipo di monade su cui stiamo operando non cambia a metà del numero forever?

Una funzione come:

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

sembra funzionare esattamente lo stesso.

+1

Il tipo di monade 'M' e non cambia. Ciò che cambia è il tipo di risultato 'b'. –

risposta

14

La firma del tipo di forever è creata per suggerire che il suo risultato sia valido per sempre. In particolare, non è possibile scrivere un'azione di tipo m b (polimorfa nel suo valore di ritorno) che termina e restituisce un valore non inferiore. Un modo alternativo per suggerire la stessa cosa sarebbe forever' :: m a -> m Void.

Un'altra risposta è semplicemente dire che questo è il tipo più generale disponibile per la funzione così come è definita, quindi quella è stata data.

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

In questi giorni, probabilmente dovrebbero essere definite in modo diverso:

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