On Wed, Feb 16, 2011 at 7:01 AM, Ross Paterson <r...@soi.city.ac.uk> wrote:
> On Tue, Feb 15, 2011 at 07:46:29PM -0800, Evan Laforge wrote:
>> Do I really have to add (Functor m) to the 300 or so functions with
>> (Monad m) on them?  Or just not use fmap or applicative?
>
> If you're using Monad m to get Functor or Applicative instances for a
> functor built from m, then I'm afraid you will need to add (Functor m)
> or (Applicative m) to the constraints in most cases.

I've noticed another solution, which is to make a class M with
Applicative and Monad as superclasses, and put the lifted basic
operations into that, then instead of '(Functor m, Monad m) => MyM m
a', write '(M m) => m a'.  I already do this same thing in a different
place so I can get unlifted access from another transformer stack.

It makes nicer looking signatures, but it's more complicated and less
direct.  Whenever it comes time to play games like that I have to do a
fair amount of trial and error because I don't understand typeclasses
or the type errors produced to get it right the first time.  And I
suppose if I can barely write it, I shouldn't, but I know other people
understand this stuff a lot better than I do.

Are other people using tricks like this?  Or will there just be
massive signature rewriting in the wake of mtl2?  Or maybe others
don't use monads so extensively?

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to