
#15649: Errors about ambiguous untouchable variable when using constraint variable in RankN type -------------------------------------+------------------------------------- Reporter: infinity0 | Owner: (none) Type: bug | Status: closed Priority: normal | Milestone: 8.6.1 Component: Compiler | Version: 8.4.3 Resolution: duplicate | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: #10651, #14921 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by RyanGlScott): * status: new => closed * resolution: => duplicate * related: => #10651, #14921 Comment: This is expected behavior. As simonpj explains in https://ghc.haskell.org/trac/ghc/ticket/10651#comment:2, GHC does not (in general) unify underneath constraints that might turn into equalities. In your program, you have {{{#!hs (forall ref. r ref => ref -> PSAny r) }}} In order to prove that `(forall ref. r ref => ref -> PSAny r)` equals `(forall ref. r0 ref => ref -> PSAny r0)` (where `r0` is a unification variable), it must conclude that `r ~ r0`. But this is not sound in general, since `r ref` might later unify with, say, `r ~ Int`, which would make `r0 := Int` a valid substitution. Moreover, `r` is not uniquely determined anywhere else in the type signature (unlike in `loadAll`, where it is determined by the `DynLoad r` argument). Therefore, `r0` is marked as untouchable in this type signature. (This is all explained in Section 5 in the [https://www.microsoft.com/en-us/research/wp- content/uploads/2016/02/jfp-outsidein.pdf OutsideIn paper].) See also #10651 and #14921. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15649#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler