[GHC] #9918: GHC chooses an instance between two overlapping, but cannot resolve a clause within the similar closed type family

GHC ghc-devs at haskell.org
Mon Dec 22 18:12:06 UTC 2014


#9918: GHC chooses an instance between two overlapping, but cannot resolve a
clause within the similar closed type family
-------------------------------------+-------------------------------------
              Reporter:  qnikst      |            Owner:
                  Type:  bug         |           Status:  new
              Priority:  normal      |        Milestone:
             Component:  Compiler    |          Version:  7.8.3
            Resolution:              |         Keywords:
      Operating System:              |     Architecture:  Unknown/Multiple
  Unknown/Multiple                   |       Difficulty:  Unknown
       Type of failure:              |       Blocked By:
  None/Unknown                       |  Related Tickets:
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------

Comment (by goldfire):

 I agree with Simon's analysis.

 The fact that thinking about infinite types means closed type families are
 less useful in more prosaic situations is annoying. But I don't know a way
 around this.

 About Simon's interesting point (2): Some testing that I've done has made
 me even more confused, because I can't seem to witness the inconsistency.
 Are you sure that `OverlappingInstances` works here, even to select the
 `MonadRaise m m` instance? In my example, I was unable to get GHC to
 commit to the tyvars-equal instance without `IncoherentInstances` --
 behavior I agree with. (It would destroy the type system to allow
 `IncoherentInstances`-like behavior with closed type families!)

 I will say that your technique of using closed type families to produce
 some switch to control instance selection to avoid overlapping instances
 is a good way to do this. Of course, instance chains would be better --
 which, of course, are just like closed type families for class instances.
 Since we don't have instance chains, you're doing the next-best thing, in
 my opinion.

 My bottom line: I'm a little confused here, too. I believe that if GHC
 treats overlapping instances without the infinite-type reasoning, it would
 be possible to squeeze out proper incoherence among instances even without
 `IncoherentInstances`. But I couldn't seem to get it to happen!

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9918#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list