
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