[GHC] #15636: Implication constraint priority breaks default class implementations

GHC ghc-devs at haskell.org
Thu Sep 13 15:23:30 UTC 2018


#15636: Implication constraint priority breaks default class implementations
-------------------------------------+-------------------------------------
        Reporter:  i-am-tom          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.6.1-beta1
      Resolution:                    |             Keywords:
                                     |  QuantifiedConstraints
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 This happens just the same if you say
 {{{
 instance (forall a. C a => D a) => D x where
   f _ = "uh oh"
   g   = f
 }}}
 Why?  Well `f :: D a => a -> String`, so the occurrence of `f` on the RHS
 of `g`'s defn here means that we need `D x`.  How can we solve `D x`?
 * We can solve it from the quantified constraint, giving rise to a need
 for `C x`
 * We can solve it from the top level instance `instance ... => D x`.

 GHC picks the first, treating "local" constraints as shadowing "global"
 ones.  The user manual specifies this.  There was some discussion in the
 GHC proposal thread.

 So currently it's by-design.  If you want to propose a different design,
 by all means do so!

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


More information about the ghc-tickets mailing list