Difference between revisions of "Monad Transformers"

From HaskellWiki
Jump to navigation Jump to search
(initial version with links to many discussions of MTL and Transformers)
 
(explanation of transformers set of packages)
Line 2: Line 2:
 
besides a third package with a similar goal but different API named [[MonadLib]]:
 
besides a third package with a similar goal but different API named [[MonadLib]]:
   
* [http://hackage.haskell.org/package/mtl MTL] - Monad Transformers Library: provides concrete monad transformers like <hask>StateT</hask> and abstractions using multi-parameter classes with functional dependencies like <hask>MonadState</hask>
+
* [http://hackage.haskell.org/package/mtl MTL] - Monad Transformers Library: provides concrete monad transformers like <hask>StateT</hask> and abstractions using [[multi-parameter type class]]es with [[functional dependencies]] like <hask>MonadState</hask>. Monads like <hask>State</hask> and their transformer counterparts like <hask>StateT</hask> are distinct types and can be accessed uniformly only through a type class abstraction like <hask>MonadState</hask>. 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:
* [http://hackage.haskell.org/package/transformers transformers]
 
  +
** [http://hackage.haskell.org/package/transformers transformers]: Provide only concrete transformers like <hask>StateT</hask>. The monad <hask>State s a</hask> is only a type synonym for <hask>StateT s Identity a</hask>. Thus both <hask>State</hask> and <hask>StateT</hask> can be accessed by the same methods like <hask>put</hask> and <hask>get</hask>. However, this only works, if <hask>StateT</hask> is the top-most transformer in a monad transformer stack. This package is Haskell 98 and thus can be also used with [[JHC]].
  +
** [http://hackage.haskell.org/package/monads-fd monads-fd]: Provides the same type classes with functional dependencies like MTL. They allow using <hask>State</hask> methods also for <hask>StateT</hask> transformers within a transformer stack.
  +
** [http://hackage.haskell.org/package/monads-tf monads-tf]: Provides a different abstraction using [[type families]]. Unfortunately the names of <code>monads-fd</code> and <code>monads-tf</code> clash,
  +
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 <code>MTL</code> can be ported to <code>transformers</code> and <code>monads-fd</code> with only slight variations.
  +
Modules require the <code>Trans</code> infix,
  +
e.g. <hask>import Control.Monad.State ...</hask> must be replaced by <hask>import Control.Monad.Trans.State ...</hask>.
  +
Since <hask>State</hask> is only a type synonym, there is no longer a constructor named <hask>State</hask>.
  +
For constructing you must use the function <hask>state</hask> and instead of pattern matching you must call <hask>runState</hask>.
   
 
== See also ==
 
== See also ==

Revision as of 22:58, 5 March 2010

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 like MonadState. Monads like State and their transformer counterparts like StateT are distinct types and can be accessed uniformly only through a type class abstraction like MonadState. 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 monad State s a is only a type synonym for StateT s Identity a. Thus both State and StateT can be accessed by the same methods like put and get. However, this only works, if StateT 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 for StateT transformers within a transformer stack.
    • monads-tf: Provides a different abstraction using type families. Unfortunately the names of monads-fd and monads-tf clash,

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