my-server
← Wiki

Monad transformer

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:

  1. A type constructor <code>t</code> of kind <code>(* -> *) -> * -> *</code>
  2. Monad operations <code>return</code> and <code>bind</code> (or an equivalent formulation) for all <code>t m</code> where <code>m</code> is a monad, satisfying the monad laws
  3. An additional operation, <code>lift :: m a -> t m a</code>, satisfying the following laws: (the notation <code>`bind`</code> below indicates infix application):
  4. <code>lift . return = return</code>
  5. <code>lift (m `bind` k) = (lift m) `bind` (lift . k)</code>

Examples

The option monad transformer

Given any monad , the option monad transformer (where denotes the option type) is defined by:

The exception monad transformer

Given any monad , the exception monad transformer (where is the type of exceptions) is defined by:

The reader monad transformer

Given any monad , the reader monad transformer (where is the environment type) is defined by:

The state monad transformer

Given any monad , the state monad transformer (where is the state type) is defined by:

The writer monad transformer

Given any monad , the writer monad transformer (where is endowed with a monoid operation with identity element ) is defined by:

The continuation monad transformer

Given any monad , the continuation monad transformer maps an arbitrary type into functions of type , where 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 yields a final state and an optional return value).

See also

References

External links