The Monad type-class inherits from Applicative (from GHC 7.10 onward; see the Monad as applicative section for more on this):

class (Applicative m) => Monad m where
  return :: a -> m a
  (>>=) :: m a -> (a -> m b) -> m b

The return function looks just like the pure function of the Applicative type-class (it lifts a value to Monad).

The bind operator (>>=) combines a Monad (m a) with a function (a -> m b), which we'll call a monadic function. The monadic function acts on type a of the first monad and returns a new monad of type (m b).

Let's make our Maybe' type a Monad:

import Control.Monad import Control.Applicative data Maybe' a = Just' a | Nothing' deriving (Show) instance Functor Maybe' where –- ... instance Applicative Maybe' where –- ... instance ...

Get Haskell Design Patterns now with the O’Reilly learning platform.

O’Reilly members experience live online training, plus books, videos, and digital content from nearly 200 publishers.