#565: overlapping instances & fundeps broken
-------------------------------------+--------------------------------------
 Reporter:  ashley-y                 |          Owner:  nobody  
     Type:  bug                      |         Status:  assigned
 Priority:  low                      |      Milestone:  _|_     
Component:  Compiler (Type checker)  |        Version:  5.00    
 Severity:  normal                   |     Resolution:  None    
 Keywords:                           |     Difficulty:  Unknown 
 Testcase:                           |   Architecture:  Unknown 
       Os:  Unknown                  |  
-------------------------------------+--------------------------------------
Changes (by igloo):

  * architecture:  => Unknown
  * difficulty:  => Unknown
  * milestone:  => _|_
  * testcase:  =>
  * os:  => Unknown

Old description:

> {{{
> 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.
> }}}

New description:

 {{{
 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.
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/565>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to