[Haskell-cafe] duplicate instance declarations. Why?
Brent Yorgey
byorgey at seas.upenn.edu
Sat Oct 25 17:06:56 EDT 2008
On Fri, Oct 24, 2008 at 10:20:39AM +0200, Alberto G. Corona wrote:
> with:
>
> >{-# OPTIONS -fglasgow-exts -fallow-undecidable-instances #-}
>
> >class A a
> >class R a
>
> >class S a
>
> >instance R a => A a
> >instance S a => A a
> ----------
This point commonly trips people up (it used to trip me up). In
addition to what others have said, I hope I can provide a bit more
intuition.
If you have
> instance R a => A a
it *seems* like it should mean, "Any a which is an instance of R is
also an instance of A". However, that's *not* what it means! It
actually means "Any type which matches 'a' (that is, any type at all)
can be an instance of A; and if some type is used as an instance of A,
then it must also be an instance of R as well."
GHC picks which instance to use by looking *only* at stuff to the
right of => in instance declarations. Only after an instance has been
chosen is the stuff to the left of the => considered.
Hopefully now it is clear why the code above is a duplicate instance
declaration; there's no way to distinguish the instances by looking
only at stuff to the right of => .
-Brent
More information about the Haskell-Cafe
mailing list