Semi-automatic instances (was Re: Re: All Monads are Functors)
jon.fairbairn at cl.cam.ac.uk
Mon Aug 28 07:12:58 EDT 2006
Jón Fairbairn <jon.fairbairn at cl.cam.ac.uk> writes:
> John Meacham <john at repetae.net> 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 cl.cam.ac.uk
More information about the Haskell-prime