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.
In the last exercise, we noted that the following code:
rule1 = do
foo <- calcFoo
bar foo
Is automatically de-sugared to:
rule1 = bind calcFoo (\foo -> bar foo)
In Haskell, the bind function is conventionally written as the >>= operator, which can be written infix style like this:
rule1 = calcFoo >>= (\foo -> bar foo)
In order for the do syntax to work correctly, we need to change our Monad class to have a >>= operator. Create a class like this:
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
fail :: String -> m a
fail = undefined
(Note: for historical reasons, Monad is required to have a fail function. We will not be concerning ourselves with failure here, so we just leave this as undefined. When you implement Monad for your own data types, you should only implement the >>= and return functions)
In the next few sections, we will be rewriting the earlier exercises using do syntax.