[GHC] #11198: TypeInType error message regressions
GHC
ghc-devs at haskell.org
Thu Sep 14 22:32:06 UTC 2017
#11198: TypeInType error message regressions
-------------------------------------+-------------------------------------
Reporter: goldfire | Owner: (none)
Type: bug | Status: new
Priority: high | Milestone: 8.2.2
Component: Compiler (Type | Version: 7.11
checker) | Keywords: TypeInType,
Resolution: | TypeErrorMessages
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
| typecheck/should_fail/{T8262,T8603,tcfail122}
Blocked By: | Blocking:
Related Tickets: #11672 | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Changes (by simonpj):
* owner: goldfire => (none)
* status: merge => new
Comment:
I now think that the patch in comment:14 is bogus.
I tripped over this when debugging #13910, following
the patch in comment:7 of that ticket. We had
{{{
[W] alpha |> co ~ t
}}}
where `co :: <blah> ~ kappa`, `alpha` and `kappa` are unification
variables, `t :: tk` is a skolem.
We can't unify `alpha := t |> sym co` because the kinds don't match, so,
according to `Note [Equalities with incompatible kinds]` (introduced in
comment:14) we emit a derived equality
{{{
[D] kappa ~ tk
}}}
and park the original Wanted as an Irred.
ALAS! It turns out that `kappa` was ''already'' unified with `tk`, so the
new Derived is instantly solved, but since no unifications happen we don't
kick out the Wanted from the inert set, so it (utterly bogusly) stays
unsolved.
Possible solution: in the kind check in `canEqTyVar` use `zonk_eq_types`.
That would make this program work, I think, but a deeper bug is lurking.
The process described in `Note [Equalities with incompatible kinds]`
relies on the kind-equality being solved by unification. But what if we
have
{{{
[W] (alpha :: F Int) ~ (beta :: *)
}}}
Now we may indeed be able solve the kind equality `F Int ~ *`, if `F` is a
type function, with a suitable instance. But there is no unification
happening, and we really do need ultimately to unify `alpha` to `beta |>
co` where `co :: * ~ F Int`. I conclude that the patch in comment:14 is
utterly wrong.
Richard do you agree?
Given `[W] co :: (alpha :: k1) ~ (ty :: k2)`, kind-heterogeneous, I think
we probably ''do'' want to generate a wanted kind-equality
{{{
[W] co_k :: k1 ~ k2
}}}
Then rewrite the original equality to
{{{
[W] co' :: (alpha :: k1) ~ (ty :: k2) |> sym co_k
}}}
'''But we want to somehow refrain from actually carrying out the
unificationn unti we have discharged `co_k`.''' One way to do that might
be to park it in Irreds and kick it out when unifying `co_k`. But that
would fail if we end up iterating the entire implication in which this
constraint lives. Maybe we should refrain from unify `alpha := ty` if
there are any coercion holes in `ty`?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11198#comment:18>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list