La classe di tipi Applicativo è stata aggiunta dopo Monad
e storicamente la classe Monad
non è stata una sottoclasse di Applicative
. Questo è stato modificato abbastanza recentemente nel Applicative-Monad-Proposal
e ciò significa che return a
dovrebbe essere equivalente a pure a
per ogni istanza Monad
.
C'è uno proposal per spostare return
fuori dalla classe Monad
e trasformarlo in un alias per pure
.
Pertanto, quando si ha a che fare con un Monad
, si dovrebbe sempre essere in grado di usare pure
anziché return
. Tuttavia, non è possibile andare dall'altra parte poiché pure
ha un tipo più generale di return
poiché restituisce solo uno Applicative
. Ad esempio la seguente
wontCheck :: Applicative f => f Int
wontCheck = return 4
non digitare verifica poiché richiede return
f
essere un Monad
.
Non c'è differenza, esistono entrambi per ragioni storiche ("Monade" non è sempre stata una superclasse di "Applicativo"). C'è una proposta per alias 'return' to' pure'. – Lee
Per chiarire, sono uguali se sai che hai a che fare con un 'Monade'. 'pure' è più generale di' return' in quanto restituisce un 'Applicative' quindi non è possibile sostituire tutte le istanze di' return' con 'pure', ma è possibile sostituire' pure' con 'return'. – Lee
@Lee, penso che sia il contrario nella seconda frase. –