Monad Transformers
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
There are currently two sets of packages that implement similar interfaces to monad transformers, besides a third package with a similar goal but different API named MonadLib:
- MTL - Monad Transformers Library: provides concrete monad transformers like
StateT
and abstractions using multi-parameter type classes with functional dependencies likeMonadState
. Monads likeState
and their transformer counterparts likeStateT
are distinct types and can be accessed uniformly only through a type class abstraction likeMonadState
. Because of the functional dependencies, MTL can currently (2010-03) only used in Hugs and GHC. MTL was the first implementation. - The newer implementation is derived from the former one and is split into the following components:
- transformers: Provide only concrete transformers like
StateT
. The monadState s a
is only a type synonym forStateT s Identity a
. Thus bothState
andStateT
can be accessed by the same methods likeput
andget
. However, this only works, ifStateT
is the top-most transformer in a monad transformer stack. This package is Haskell 98 and thus can be also used with JHC. - monads-fd: Provides the same type classes with functional dependencies like MTL. They allow using
State
methods also forStateT
transformers within a transformer stack. - monads-tf: Provides a different abstraction using type families. Unfortunately the names of
monads-fd
andmonads-tf
clash,
- transformers: Provide only concrete transformers like
thus you can currently not import both packages in one package.
How can I use MTL and transformers together?
Shall I use MTL or transformers?
How to move from MTL to transformers?
Any package using MTL
can be ported to transformers
and monads-fd
with only slight variations.
Modules require the Trans
infix,
e.g. import Control.Monad.State ...
must be replaced by import Control.Monad.Trans.State ...
.
Since State
is only a type synonym, there is no longer a constructor named State
.
For constructing you must use the function state
and instead of pattern matching you must call runState
.
See also
- Monad Transformers Explained
- http://www.haskell.org/pipermail/libraries/2009-March/011415.html
- http://www.haskell.org/pipermail/libraries/2009-December/012914.html
- http://www.haskell.org/pipermail/haskell-cafe/2010-January/071842.html
- http://www.mail-archive.com/debian-haskell@lists.debian.org/msg01241.html