When we are using a monad in a Haskell program we can take some function of a type 'a':

f :: a -> a

and add some 'effect' to that function:

a -> m a

This effect could be somthing like input/output or state which would otherwise make the program non-pure functional.

### Identity Monad

On this page we will create instances of the built in Monad class, which is defined in the prelude like this:

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

In the identity monad the modad does not have any additional effect and the function 'f' is applied directly to x:

module Main where instance Monad Ident where return x = x x >>= f = f x |

### Maybe Monad

We can introduce a functor which takes any type and adds a 'nothing' value. | |

We can draw this as an endo-functor. |

#### Maybe - Natural Transformations

The unit transform adds the 'nothing' value to type 'a' | |

The mult transform combines the inner and outer 'nothing' into a single nothing. |

#### Maybe - Haskell Code

module Main where instance Monad Maybe where return x = Just x (Just x) >>= f = f x Nothing >>= _ = Nothing (Just _ ) >> f = f Nothing >> _ = Nothing Fail _ = Nothing maybe :: b -> (a -> b) -> Maybe a -> b maybe n _ Nothing = n maybe _ f (Just x) = f x |