PureScript Edition
A set of challenges for jump starting your understanding of monads.
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Now your Set4.purs module has fairly decent set of abstract tools all built on the Monad
interface. Now go back through sets 1, 2, and 3 and redo them all using the library of functions you built up in Set4.purs. Since Gen
is now a newtype you will have to make some changes to the functions that use it. This may seem like a waste of time, but it will develop your familiarity with the names actually used* by PureScript’s monad library. This is the core of developing a working knowledge of monads. The first three sets were the motivation. Now we’re getting to the real world use.
* This is a lie. Unlike Haskell, sequence
is part of Data.Traversable
, and PureScript’s monad libraries don’t have liftM2
and liftM3
. Instead, you could use lift2
and lift3
from Apply
(in Control.Apply
), which is a superclass of Monad
, or you might rewrite using <$>
and <*>
. Also, pure
is actually a member of Applicative
, but these Monad Challenges were originally written for Haskell and asked the reader to implement return
and bind
for their Monad
instances. In Haskell, for path-dependent reasons, return
is a member of Monad
and is equivalent to pure
, as of the adoption of the Haskell 2014 Applicative => Monad proposal, when Applicative became a superclass of Monad in Haskell as well (implemented in GHC 7.10). In current versions of Haskell, pure
from Applicative
provides the default implementation of return
in Monad
instances.