Personal tools

Monad Transformers

From HaskellWiki

(Difference between revisions)
Jump to: navigation, 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.
* [http://hackage.haskell.org/package/transformers transformers]
+
* The newer implementation is derived from the former one and is split into the following components:
  +
** [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.


Contents

1 How can I use MTL and transformers together?

2 Shall I use MTL or transformers?

3 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
.

4 See also