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 Monad Maybe' where return x = Just' x Nothing' >>= _ = Nothing' (Just' x) >>= f = (f x)
The bind
operator for Maybe'
says:
Given
Nothing'
, ignore the monadic function and simply return...