The Identity monad
Overview
| Computation type: |
Simple function application |
| Binding strategy: |
The bound function is applied to the input value.
Identity x >>= f == Identity (f x)
|
| Useful for: |
Monads can be derived from monad transformers applied to the Identity monad. |
| Zero and plus: |
None. |
| Example type: |
Identity a |
Motivation
The Identity monad is a monad that does not embody any computational strategy.
It simply applies the bound function to its input without any modification.
Computationally, there is no reason to use the Identity monad instead of
the much simpler act of simply applying functions to their arguments. The
purpose of the Identity monad is its fundamental role in the theory of
monad transformers (covered in Part III). Any monad transformer applied to
the Identity monad yields a non-transformer version of that monad.
Definition
newtype Identity a = Identity { runIdentity :: a }
instance Monad Identity where
return a = Identity a -- i.e. return = id
(Identity x) >>= f = f x -- i.e. x >>= f = f x
|
The runIdentity label is used in the type definition because
it follows a style of monad definition that explicitly represents monad
values as computations.
In this style, a monadic computation is built up using the monadic operators
and then the value of the computation is extracted using the
run****** function. Because the Identity monad does not do
any computation, its definition is trivial. For a better example
of this style of monad, see the State monad.
Example
A typical use of the Identity monad is to derive a monad from a monad transformer.
-- derive the State monad using the StateT monad transformer
type State s a = StateT s Identity a
|