different flavours of Monad Template Library

Ross Paterson ross at soi.city.ac.uk
Sun Jan 4 18:50:28 EST 2009

On Sun, Jan 04, 2009 at 11:22:15PM +0100, Henning Thielemann wrote:
> I see now at least three MTL libraries at hackage, namely
>   mtl
>   mmtl
>   mtl-tf
>  They all define both the example data types and according type classes 
> in modules with the same name. This way you can only use one of these  
> packages in all packages you import. However the data types are defined  
> the same way in the packages, only the classes differ.
>  I wished, there would be one package defining only the datatypes, say  
> "mtl-data", and three ones with the names "mtl", "mmtl", "mtl-tf" that  
> define their classes with corresponding instances. These classes should 
> be in different modules, so you can use different class frameworks in the 
> same project. The data type package would be useful on its own and could  
> be run on the simplest Haskell compilers, since no functional 
> dependencies are required.

I agree.  I had a go at such a restructuring of mtl a while ago:


The first is a Haskell 98 package that defines the monad transformers,
operations and liftings, like the mtl-data suggestion.  The second adds
the FD-based classes.  It's close to complete compatibility with mtl,
except that State is a synonym for StateT Identity etc.  The main
problem was haddock's limitations with inter-package re-exports.

>  However there is the compatibility problem: Currently 
> Control.Monad.State exports also the MonadState class, which would no 
> longer work. Maybe we can reserve Control.Monad.State for mtl, which 
> exports Control.Monad.State.Data.Lazy from mtl-data and 
> Control.Monad.State.Class from mtl.

I used Control.Monad.Trans.State.Lazy for the transformer.

More information about the Libraries mailing list