In functional programming, a monad transformer is a type constructor which takes a monad as an argument and returns a monad as a result.
Monad transformers can be used to compose features encapsulated by monads – such as state, exception handling, and I/O – in a modular way. Typically, a monad transformer is created by generalising an existing monad; applying the resulting monad transformer to the identity monad yields a monad which is equivalent to the original monad (ignoring any necessary boxing and unboxing).
Definition
A monad transformer consists of:
- A type constructor tof kind(* -> *) -> * -> *
- Monad operations returnandbind(or an equivalent formulation) for allt mwheremis a monad, satisfying the monad laws
- An additional operation, lift :: m a -> t m a, satisfying the following laws:[1] (the notation`bind`below indicates infix application):- lift . return = return
- lift (m `bind` k) = (lift m) `bind` (lift . k)
 
Examples
Given any monad  , the option monad transformer
, the option monad transformer  (where
 (where  denotes the option type) is defined by:
 denotes the option type) is defined by:
 
Given any monad  , the exception monad transformer
, the exception monad transformer  (where E is the type of exceptions) is defined by:
 (where E is the type of exceptions) is defined by:
 
Given any monad  , the reader monad transformer
, the reader monad transformer  (where E is the environment type) is defined by:
 (where E is the environment type) is defined by:
 
Given any monad  , the state monad transformer
, the state monad transformer  (where S is the state type) is defined by:
 (where S is the state type) is defined by:
 
Given any monad  , the writer monad transformer
, the writer monad transformer  (where W is endowed with a monoid operation ∗ with identity element
 (where W is endowed with a monoid operation ∗ with identity element  ) is defined by:
) is defined by:
 
Given any monad  , the continuation monad transformer maps an arbitrary type R into functions of type
, the continuation monad transformer maps an arbitrary type R into functions of type  , where R is the result type of the continuation.  It is defined by:
, where R is the result type of the continuation.  It is defined by:
 
Note that monad transformations are usually not commutative: for instance, applying the state transformer to the option monad yields a type  (a computation which may fail and yield no final state), whereas the converse transformation has type
 (a computation which may fail and yield no final state), whereas the converse transformation has type  (a computation which yields a final state and an optional return value).
 (a computation which yields a final state and an optional return value).
See also
References
External links