Fundeps and -fallow-overlapping-instances

Ashley Yakeley
Sun, 10 Jun 2001 01:54:55 -0700

My exploration into the more unusual and powerful uses of class fundeps 
has discovered some curiosities. For instance, consider this:

class X a
instance X Bool
instance (Num a) => X a

For as long as "instance Num Bool" is not declared, the two instances do 
not de facto overlap. But that's not immediately obvious to GHC, so it 
will complain, at least by default. But I can stop it complaining by 
passing -fallow-overlapping-instances, which I interpret as asking GHC to 
trust me that instances don't overlap.

But consider this, with an added dependent argument:

class X a b | a -> b
instance X Bool Bool
instance (Num a) => X a Char

Now GHC will complain even with -fallow-overlapping-instances. This seems 

So why have the fundep? Well, GHC can still make use of it, and it can 
still calculate the dependent type:

class X a b | a -> b where
  foo :: a -> b;

instance X Bool Bool where
  foo a = a;

instance (Num a) => X a Char where
  foo a = 'N';

test = foo True;

Without the fundep, GHC cannot calculate 'foo True', since 'instance X 
Bool Bool' is not general enough. This is correct. But with the fundep, 
GHC will complain that it can't prove that the two instances don't 
conflict for the fundep, even with -fallow-overlapping-instances.

Ashley Yakeley, Seattle WA