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
t
of
kind (* -> *) -> * -> *
# Monad operations
return
and
bind
(or an equivalent formulation) for all
t m
where
m
is a monad, satisfying the
monad laws
# An additional operation,
lift :: m a -> t m a
, satisfying the following laws:
[
] (the notation
`bind`
below indicates infix application):
##
lift . return = return
##
lift (m `bind` k) = (lift m) `bind` (lift . k)
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
*
Monads in functional programming
In functional programming, a monad is a software design pattern with a structure that combines program fragments ( functions) and wraps their return values in a type with additional computation. In addition to defining a wrapping monadic type, m ...
References
External links
A highly technical blog post briefly reviewing some of the literature on monad transformers and related concepts, with a focus on categorical-theoretic treatment{{Expand section, date=May 2008
Functional programming