Hi,

Thanks for creating this proposal and doing a thorough analysis of the issues, including the package breakage analysis.

On Thu, Sep 16, 2010 at 10:23 AM, Ross Paterson <ross@soi.city.ac.uk> wrote:
 * simple monads are now aliases for monad trasformers applied to Identity,
  e.g.

       newtype Reader r a = Reader { runReader :: r -> a }

  is replaced by

       type Reader r = ReaderT r Identity

       reader :: (r -> a) -> Reader r a
       reader f = ReaderT (Identity . f)

       runReader :: Reader r a -> r -> a
       runReader m = runIdentity . runReaderT m

  Rationale: This avoids repetition in the interfaces of both
  transformers and the proposed mtl-2.  It makes transformers more useful
  on its own, and also saves clients of mtl from defining instances
  for both Reader r and ReaderT r and ensuring that they are consistent.

I would like to know if this additional abstraction has a noticeable performance cost. Does anyone know of a benchmark that could be used to test this? Perhaps one involving State.

Paying careful attention to inlining should help remove any overhead.

== Transition issues ==

 * 41 failed with the new mtl:
   * 11 because they defined their own Applicative instances (which can
     now be deleted)
   * 11 because of the changed constraint on Functor instances
   * 15 that used the constructors of base monads (which can be trivially
     replaced)
   * 3 that defined instances for base monads
   * 1 that defined an overlapping Error instance
 
Should we try to get these 41 package to add an upper bound on their mtl dependency before mtl-2 is released so they don't break? The authors could then migrate their code over to mtl-2 as soon as it has been published.

If this proposal is approved, we should create a small wiki with migration tips.

Cheers,
Johan