id,summary,reporter,owner,description,type,status,priority,milestone,component,version,resolution,keywords,cc,os,architecture,failure,testcase,blockedby,blocking,related,differential,wikipage
565,overlapping instances & fundeps broken,ashley-y,simonpj,"{{{
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 actually 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. I believe
this is inappropriate.
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.
I submit that GHC with -fallow-overlapping-instances should not complain
in this case.
}}}",bug,closed,low,⊥,Compiler (Type checker),5.0,invalid,,,Unknown/Multiple,Unknown/Multiple,None/Unknown,,,,,,