Semi-automatic instances (was Re: Re[6]: All Monads are Functors)

Jón Fairbairn jon.fairbairn at
Mon Aug 28 07:12:58 EDT 2006

Jón Fairbairn <jon.fairbairn at> writes:

> John Meacham <john at> 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

> 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 at

More information about the Haskell-prime mailing list