What is the difference between return
and pure
from Control.Applicative
? It seems that I can use pure
even at the end of a do
block?
So is there any situation where one should be preferred over the other (besides that everyone expects a return
at the end of a do
Block)?
In GHC 7.8 and before, Applicative
was not a superclass of Monad
. It was even possible for a Monad
instance to not have an Applicative
instance. There was, however, an expectation that pure
and return
should have the same behavior for types that are instances of both.
In GHC 7.10, due to the Functor-Applicative-Monad Proposal, Applicative
is now a superclass of Monad
(class Applicative m => Monad m
) and it is now a rule that pure
and return
must be the same for all Monad
instances. In fact, the default implementation of return
is now pure
, as seen in the source on hackage.
pure
might be preferred to return
because it does not incur a Monad
constraint, only an Applicative
constraint, thus making the function more general. return
might be preferred to pure
in do notation because of historical precedent, but pure
could be used to exactly the same effect.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With