Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
GHC
GHC
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 4,323
    • Issues 4,323
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
    • Iterations
  • Merge Requests 372
    • Merge Requests 372
  • Requirements
    • Requirements
    • List
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
  • Security & Compliance
    • Security & Compliance
    • Dependency List
    • License Compliance
  • Operations
    • Operations
    • Incidents
    • Environments
  • Analytics
    • Analytics
    • CI / CD
    • Code Review
    • Insights
    • Issue
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • Glasgow Haskell Compiler
  • GHCGHC
  • Issues
  • #565

Closed
Open
Opened Jul 15, 2001 by ashley-y@trac-ashley-y

overlapping instances & fundeps broken

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.
Edited Mar 09, 2019 by Ian Lynagh <igloo@earth.li>
Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking
None
Due date
None
Reference: ghc/ghc#565