Note [Instantiation variables are short lived]
* An instantation variable is a mutable meta-type-variable, whose level number
is QLInstVar.
* Ordinary unification variables always stand for monotypes; only instantiation
variables can be unified with a polytype (by `qlUnify`).
* When we start typechecking the argments of the call, in tcValArgs, we will
(a) monomorphise any un-filled-in instantiation variables
(see Note [Monomorphise instantiation variables])
(b) zonk the argument type to reveal any polytypes before typechecking that
argument (see calls to `zonkTcType` and "Crucial step" in tcValArg)..
See Section 4.3 "Applications and instantiation" of the paper.
* The constraint solver never sees an instantiation variable [not quite true;
see below]
However, the constraint solver can see a meta-type-variable filled
in with a polytype (#18987). Suppose
f :: forall a. Dict a => [a] -> [a]
xs :: [forall b. b->b]
and consider the call (f xs). QL will
* Instantiate f, with a := kappa, where kappa is an instantiation variable
* Emit a constraint (Dict kappa), via instantiateSigma, called from tcInstFun
* Do QL on the argument, to discover kappa := forall b. b->b
But by the time the third step has happened, the constraint has been emitted
into the monad. The constraint solver will later find it, and rewrite it to
(Dict (forall b. b->b)). That's fine -- the constraint solver does no implicit
instantiation (which is what makes it so tricky to have foralls hiding inside
unification variables), so there is no difficulty with allowing those
filled-in kappa's to persist. (We could find them and zonk them away, but
that would cost code and execution time, for no purpose.)
Since the constraint solver does not do implicit instantiation (as the
constraint generator does), the fact that a unification variable might stand
for a polytype does not matter.
* Actually, sadly the constraint solver /can/ see an instantiation variable.
Consider this from test VisFlag1_ql:
f :: forall {k} {a :: k} (hk :: forall j. j -> Type). hk a -> ()
bad_wild :: ()
bad_wild = f @_ MkV
In tcInstFun instantiate f with [k:=k0, a:=a0], and then encounter the `@_`,
expecting it to have kind (forall j. j->Type). We make a fresh variable (it'll
be an instantiation variable since we are in tcInstFun) for the `_`, thus
(_ : k0) and do `checkExpectedKind` to match up `k0` with `forall j. j->Type`.
The unifier doesn't solve it (it does not unify instantiation variables) so
it leaves it for the constraint solver. Yuk. It's hard to see what to do
about this, but it seems to do no harm for the constraint solver to see the
occasional instantiation variable. References 1
- Monomorphise instantiation variables GHC.Tc.Gen.App
Referenced by 3
- Quick Look overview GHC.Tc.Gen.App
- GHC.Tc.Gen.App call site
- GHC.Tc.Solver.Rewrite call site