[GHC] #15589: Always promoting metavariables during type inference may be wrong

GHC ghc-devs at haskell.org
Mon Sep 3 23:06:10 UTC 2018


#15589: Always promoting metavariables during type inference may be wrong
-------------------------------------+-------------------------------------
        Reporter:  goldfire          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.4.3
      Resolution:                    |             Keywords:  TypeInType
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 >  there might be a variable born as a skolem that nevertheless mentions
 unification variables in its kind.

 Rats.   Yes, that is true.  Also an exisential match on
 {{{
 data T k where
   MkT :: forall (a :: k). blah -> T k
 }}}
 > "forbid lexical meta-tyvars in type signatures" but that's a huge
 hammer.

 Yes, that is what I'm saying.  Let's review the problem:

 * We can't instantiate a type signature that contains a meta-variable if
 that meta-variable might later be instantiated to one of the quantified
 variables of the signature.  (Unless we venture in the uncharted waters of
 delayed substitutions.)

 * If we have solved all the constraints arising from the signature, and
 any free meta-variables are from an outer level, there is no problem --
 outer-level variables can't be solved in a way that mentions the inner
 quantifiers.

 * But "solving all the constraints" might (in obscure cases) depend on
 whether or not we have worked out the value of some outer level variable.
 Thus `If alpha[0] beta[1] Int ~ a[1]`; if `alpha` turns out to be `True`
 we learn that `beta := a`.

 * We could reject the obscure situation, but we can't detect when it
 happens: suppose we unified `alpha := True` much much earlier and zonked
 it away.

 * This kind of order-dependence already arises when we use `simplifyInfer`
 in `NoMonoLocalBinds`; here again, an outer `alpha[0]` might unlock an
 inner constraint.   But with `MonoLocalBinds` (our well-behaved case), it
 does not happen.

 We'd like a `MonoLocalBinds` for type signatures, which ensures their good
 behaviour.  But I don't see one, apart from the big hammer of saying that
 the type can mention only lexically scoped variables whose type and kind
 are fixed from the moment it comes into scope.  (And even that is not a
 very well-defined statement.)

 It's very frustrating that there is no simple way to identify a well-
 behaved subset.

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


More information about the ghc-tickets mailing list