On Wed, 23 Mar 2005 19:14:41 -0800, Thomas Hallgren <hallgren@cse.ogi.edu> wrote:
Iavor Diatchki wrote:
Just to avoid confusion I think the suggestions were: class Functor f => Monad f where ... class Functor f => FunctorM f where ...
I know the first one differs from the Haskell report, but perhaps this is a flaw in the library design that should be fixed.
Yes, I think this should be fixed, and perhaps it could be done in a backward compatible way? If classes were allowed to declare default methods for superclasses, then you could have
class Functor f where fmap :: ... class Functor m => Monad m where ...the usual stuff... fmap = liftM
Then declaring
instance Monad T where ...
for some T, would implicitly introduce an instance Functor T, if it is not defined explicitly...
-- Thomas H
I agree, and think that's a great idea for solving that problem. Does anyone see any possible difficulties with it? I think that perhaps specifying the entire instance might make more sense, eg: class Functor m => Monad m where {- ... usual stuff ... -} instance Functor m where fmap = liftM Having such a thing seems quite useful. As long as it doesn't break the world, I'd personally like to have this feature. One issue might be which default instance gets chosen when two classes both provide default instances for a given class. Perhaps in this case, we can just force the user to provide an instance, or produce a compile-time warning and select one automatically in some canonical fashion. What do the Simons think? - Cale