MTL vs Transformers. Any status update?

Duncan Coutts duncan.coutts at
Sun Nov 29 14:02:22 EST 2009

On Sun, 2009-11-29 at 13:35 +0000, Ross Paterson wrote:
> On Sun, Nov 29, 2009 at 01:03:06PM +0000, Duncan Coutts wrote:
> > On Sat, 2009-11-28 at 16:56 +0000, Ross Paterson wrote:
> > > On Sat, Nov 28, 2009 at 04:40:49PM +0000, Duncan Coutts wrote:
> > > > Could someone remind me why it's better for use to ask everyone to
> > > > switch to monads-fd / transformers rather than to mtl-2? Does that make
> > > > the transition easier?
> > > 
> > > The problem is that transformers and mtl use the same module names,
> > > such as Control.Monad.Identity.  Unless one of these packages is hidden,
> > > people using ghci or ghc --make will have problems.
> > 
> > Right, so having transformers + mtl is bad, but why do we want to end up
> > with a situation where we have both? If you've all agreed what should go
> > into the new monad package, can't we call that mtl-2 ? Why would we want
> > to define things in one package and re-export them in another?
> Because there is not one new monad package, but two.  The idea is to
> split the mtl package to decouple monad transformers from functional
> dependencies.  The transformers part can then be used in Haskell 98 code,
> or with type classes using type functions.  Exposed modules from mtl are
> split between the resulting two packages, so neither is a replacement for
> mtl-1.  As I said above, having both would be a transitional arrangement,
> on the way to replacing mtl with the two packages split from it.  mtl-2
> is an attempt to smooth that transition, but it would eventually go away.

Ok, how about this:

transformers	H98 bits, registered hidden by default
mtl 2		re-exports transformers, adds type function stuff
mtl-fd		alternative that uses FDs, hidden by default

I'm not sure what you agreed, if you chose the FD one as default then
use mtl-tf as the alternative. Whichever you have chosen as the
recommended stuff should be called mtl 2, because that is the easiest to
explain to everyone.

So all the packages now using mtl-1, move up to mtl 2. Then for packages
that only want transformers, they depend on transformers. Similarly for
the mtl-fd alternative (and whether that re-exports transformers or
whether such packages should depend on transformers + mtl-fd is up to

Users of ghci / ghc --make will end up using mtl 2 by default and there
will be no module name clashes because transformers and mtl-fd will by
hidden by default (Cabal-1.6+ can do that). The hiding does not affect
cabal packages of course.


More information about the Libraries mailing list