Monad

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 books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.