[GHC] #2256: Incompleteness of type inference: must quantify over implication constraints

GHC ghc-devs at haskell.org
Wed Mar 8 02:40:18 UTC 2017


#2256: Incompleteness of type inference: must quantify over implication
constraints
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  simonpj
            Type:  bug               |               Status:  new
        Priority:  lowest            |            Milestone:
       Component:  Compiler (Type    |              Version:  6.8.2
  checker)                           |
      Resolution:                    |             Keywords:
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 nfrisby):

 Your `min` discussion was helpful to me, but I think it's mostly
 unrelated, in retrospect; the `Ord a` dictionary -- again ignoring
 overlapping/incoherent instances -- could only ever "overlap" with a
 parametric instance of `Ord`, since `a` is skolem. #9701, on the other
 hand, seems to demonstrate exactly what you were getting at (#12791 too?).

 Replying to [comment:14 goldfire]:
 > I initially put this ticket into my internal notes as "Difficulty:
 Rocket Science", but I've changed my mind. I think this is actually
 straightforward to implement.
 >
 > GHC already has implication constraints, except that they're effectively
 all Wanteds. So, all we would need are to be able to make Given
 implication constraints. But, these should be rather straightforward,
 because we can view top-level instances as Given implication constraints.
 We can just adapt the current look-in-Givens algorithm to do some
 matching, just like the instance-selection algorithm does. When we find an
 implication-constraint Given that matches a Wanted, we use it to solve the
 Wanted and then emit new Wanteds for the antecedents of the Given
 implication.
 >
 > I was initially concerned about overlap here -- what if an implication
 Given's RHS overlaps with a global instance? -- but this was a red
 herring. Givens have always potentially overlapped with global instances,
 and very few people are bothered. For example:
 >
 > {{{
 > min :: Ord a => a -> a -> a
 > }}}
 >
 > If we call `min` at type `Int`, the `Ord` constraint is potentially
 ambiguous: do we mean the dictionary supplied or the global `Ord Int`
 dictionary? Of course, we mean the local one, and we don't require
 `-XIncoherentInstances` to do so. So, worrying about overlap in the
 context of implication Givens is a red herring. We have a clear rule:
 local constraints always shadow global ones. That's nice, simple, and
 unsurprising.
 >
 > This also doesn't change the "GHC never backtracks" principle. If a
 local implication-constraint's RHS matches, it is used, just like if GHC
 finds a global implication constraint (read, global constrained instance).
 >
 > To implement this, GHC would also need to be able to produce the witness
 for an implication constraint, but this is just like inferring the lambdas
 for a higher-rank type. I don't see any challenge here.
 >
 > Of course, a niggling feeling tells me that this ''has'' to be harder
 than I'm seeing it. But, really, all I see standing in the way is a bit of
 plumbing.
 >
 > Thoughts?

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


More information about the ghc-tickets mailing list