
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: http://darcs.haskell.org/packages/transformers/ http://darcs.haskell.org/packages/mtl-split/ 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.