[GHC] #10204: Odd interaction between rank-2 types and type families

GHC ghc-devs at haskell.org
Mon Apr 6 08:32:01 UTC 2015


#10204: Odd interaction between rank-2 types and type families
-------------------------------------+-------------------------------------
        Reporter:  diatchki          |                   Owner:
            Type:  feature request   |                  Status:  new
        Priority:  normal            |               Milestone:  ⊥
       Component:  Compiler (Type    |                 Version:  7.10.1
  checker)                           |                Keywords:
      Resolution:                    |            Architecture:
Operating System:  Unknown/Multiple  |  Unknown/Multiple
 Type of failure:  GHC rejects       |               Test Case:
  valid program                      |                Blocking:
      Blocked By:                    |  Differential Revisions:
 Related Tickets:                    |
-------------------------------------+-------------------------------------
Changes (by simonpj):

 * type:  bug => feature request
 * milestone:   => ⊥


Comment:

 You could indeed consider this a failure of inference, but it's by-design
 (currently), and it's one I don't know how to fix.

 Consider this constraint that arise from `example`:
 {{{
 forall s. (F s ~ Int) => (s -> beta) ~ (sigma ~ Char)
 }}}
 Here
  * `beta` is a unification variable that arises from instantiating `b` in
 the call to `f`.
  * `sigma` is a unification variable that arises from instantiating `s` in
 the call to `k`.

 We can safely unify `sigma := s`, because the call to `k` is inside the
 polymorphic argument to `f`.  But it is less clear that we can unify `beta
 := Char` because both (a) it affects the inferred type of `(f k)`, and (b)
 the `(beta ~ Char)` is under an equality `F s ~ Int`..

 Suppose that instead of `F s ~ Int` it had been `F s ~ Char`.  Then should
 we unify `beta := Char` or `beta := F s`?  GHC never guesses,so instead it
 refrains from unifying `beta`, saying that it is "untouchable", hoping
 that some other constraint will determine how to unify `beta`.

 You may say that `(F s ~ Int)` can't possibly affect `beta`, but it should
 be clear that it's ''really'' hard to be sure about that.  GHC simply
 treats ''any'' equality in an implication constraint as making all the
 unification variables from an outer scope untouchable.

 This issue is discussed (somewhat) in 5.6.1 of the
 [https://wiki.haskell.org/Simonpj/Talk:OutsideIn OutsideIn paper]

 I'll mark this as a feature request!

 Simon

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


More information about the ghc-tickets mailing list