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

GHC ghc-devs at haskell.org
Tue Dec 16 01:44:05 UTC 2014


#2256: Incompleteness of type inference: must quantify over implication
constraints
-------------------------------------+-------------------------------------
              Reporter:  simonpj     |            Owner:  simonpj
                  Type:  bug         |           Status:  new
              Priority:  lowest      |        Milestone:  7.10.1
             Component:  Compiler    |          Version:  6.8.2
  (Type checker)                     |         Keywords:
            Resolution:              |     Architecture:  Unknown/Multiple
      Operating System:              |       Difficulty:  Unknown
  Unknown/Multiple                   |       Blocked By:
       Type of failure:  GHC         |  Related Tickets:
  rejects valid program              |
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------

Comment (by goldfire):

 * Inference: We don't. Just like we don't infer higher-rank types (which,
 of course, are the same as implication constraints). If a user wants this
 feature, they have to ask for it.

 * Completeness: This is thornier. Here is how I see a problem arising:

 {{{
 class C a
 class D a
 instance D Int

 needsD :: D a => a -> ()
 implic :: (forall a. C a => D a) -> ()
 implic = needsD (5 :: Int)
 }}}

     When typechecking `implic`, the local universal dictionary for `D a`
 will be used to provide a dictionary to `needsD`. This will then generate
 an unsatisfiable wanted `C Int`. But, of course, we could have just used
 the global instance `D Int` instead.

     An issue such as this one can't arise today (even with local
 dictionaries shadowing global ones) because local dictionaries never give
 rise to new wanteds. If you have a local dictionary, it's good to use.

     Given/Given interactions would be the same. If one implication-Given
 can be used in an interaction, it would be, giving rise to its antecedent
 Wanted constraints.

     This does get me a little worried about nondeterminism. But, I
 conjecture that if this interaction can give rise to nondeterminism, then
 it would be possible to exhibit the nondeterminism today, using
 overlapping instances.

     So, it all comes down to specifying completeness against what spec,
 and I'm saying that we could be complete against a spec where every local
 constraint shadows every overlapped global one. That is, when `(forall a.
 C a => D a)` is in scope, `instance D Int` is not. Will this be easy
 enough to use to make it practicable? There will be some surprises around
 it, but I think it's all quite easy to digest with a little guidance.
 (Certainly easier to understand than closed type families!)

 * Impredicativity: This, to me, is just like the story in kind `*`. `c`
 should be forbidden from unifying with an implication constraint.

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


More information about the ghc-tickets mailing list