Note [mkAppTyM]
mkAppTyM is trying to guarantee the Purely Kinded Type Invariant
(PKTI) for its result type (fun arg). There are two ways it can go wrong:
* Nasty case 1: forall types (polykinds/T14174a)
T :: forall (p :: *->*). p Int -> p Bool
Now kind-check (T x), where x::kappa.
Well, T and x both satisfy the PKTI, but
T x :: x Int -> x Bool
and (x Int) does /not/ satisfy the PKTI.
* Nasty case 2: type synonyms
type S f a = f a
Even though (S ff aa) would satisfy the (PKTI) if S was a data type
(i.e. nasty case 1 is dealt with), it might still not satisfy (PKTI)
if S is a type synonym, because the /expansion/ of (S ff aa) is
(ff aa), and /that/ does not satisfy (PKTI). E.g. perhaps
(ff :: kappa), where 'kappa' has already been unified with (*->*).
We check for nasty case 2 on the final argument of a type synonym.
Notice that in both cases the trickiness only happens if the
bound variable has a pi-type. Hence isTrickyTvBinder. References 0
This Note does not link to any other.
Referenced by 4
- GHC.Tc.Gen.HsType call site ×2
- The Purely Kinded Type Invariant (PKTI) GHC.Tc.Gen.HsType
- zonkEqTypes and the PKTI GHC.Tc.Solver.Equality