
Jón Fairbairn
John Meacham
writes: The problem is you can't have working code change its behavior because of a module import (other than failing), say, by bringing an instance into scope that wasn't before. There is no way to have a monad instance 'automatically' declare a functor instance without changing what the mo instance looks like somehow which would be a backwards incompatable change.
In that case we really ought just to accept that we have to declare the instances and swallow
class Functor m => Monad m where ...
without any cleverness.
Or, alternatively, make my previous suggestion less automatic. I was suggesting that we could allow default instances of superclasses in class declarations; we'd say
class Functor m => Monad m where (>>=):: ... instance Functor m where fmap = ...<a> ...
what I'm proposing here is that we do that, but the "default" instances are never supplied automatically. Instead we allow a "deriving" clause on instance declarations:
instance Monad [] deriving Functor where ...
Now this would be exactly equivalent to
instance Monad [] where ... instance Functor [] where fmap = ...<a>
(and just as much an error if there's another instance declaration for Functor somwhere), while an instance declaration without the deriving clause would not say anything about a Functor instance at all. So, not fully automatic -- so avoiding the above problem, but more concise than a whole instance declaration. -- Jón Fairbairn Jon.Fairbairn@cl.cam.ac.uk