[GHC] #16241: Avoid orphan instances with OVERLAPPABLE (sometimes)

GHC ghc-devs at haskell.org
Mon Jan 28 14:16:37 UTC 2019


#16241: Avoid orphan instances with OVERLAPPABLE (sometimes)
-------------------------------------+-------------------------------------
        Reporter:  AntC              |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.6.1
      Resolution:                    |             Keywords:
Operating System:  Windows           |         Architecture:
 Type of failure:  Poor/confusing    |  Unknown/Multiple
  error message                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #15135            |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by AntC):

 Thanks Simon,

 > Currently the user manual ...

 is only talking about compiling within a single module, or at least when
 all instances are visible from imports in a single module. I.e. compiling
 module `Main` in the example. Or if you squish all the code into a single
 module then indeed

 >  you don't need to say "OVERLAPPABLE" for an instance to be
 overlappable.

 But when compiling version 2 of module `Help`

 * there is only one visible instance of `MyShow` (so the quote from the
 manual doesn't apply: there's no alternative candidates to eliminate);
 * its head `[a]` does indeed match the wanted constraint `MyShow [a] =>`
 from the signature for `showHelp`, so it's the "prime candidate" per the
 user manual; and yet
 * the instance is marked `OVERLAPPABLE`, then GHC ''doesn't'' select that
 instance, contra what the user manual says.
 * I know it doesn't select that instance, because it doesn't simplify to
 constraint `MyShow a =>`.
 * Then in compiling module `Main`, we maintain referential transparency:
 `showHelp [MkT]` ===> `myshow [MkT]`, which wants `instance MyShow [T]` in
 preference to `instance MyShow [a]`.
 * So both calls in `main` produce the same result, viz `"Used more
 specific instance"`.

 So I'm disagreeing with your

 >  It's enough to say "OVERLAPPING" in the overlapping instance.

 It is enough only providing those overlapping instance(s) are in the same
 module. If the overlapping instance(s) are in a separate module that's
 importing the `OVERLAPPABLE` instance, then you must say the imported
 instance is OVERLAPPABLE.

 > So you can't deduce anything much from the absence of "OVERLAPPABLE",
 sadly.

 Well, you can deduce you're liable to see "fragile"/"incoherent" behaviour
 ;-).

 >  If we you could only overlap an explicitly-overlappable instance, we
 could commit to them more aggressively.

 I think you have that back-to-front: this ticket is showing currently GHC
 does commit aggressively to an eligible instance ''unless'' it's
 explicitly-overlappable. (And BTW per #15135, with `-O2` GHC commits
 aggressively anyway and ignores `OVERLAPPABLE`.)

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


More information about the ghc-tickets mailing list