Note [Kind generalisation]
Step 5 of Note [Recipe for checking a signature], namely kind-generalisation, is done by kindGeneraliseAll kindGeneraliseSome kindGeneraliseNone Here, we have to deal with the fact that metatyvars generated in the type will have a bumped TcLevel, because explicit foralls raise the TcLevel. To avoid these variables from ever being visible in the surrounding context, we must obey the following dictum: Every metavariable in a type must either be (A) generalized, or (B) promoted, or See Note [Promotion in signatures] (C) a cause to error See Note [Naughty quantification candidates] in GHC.Tc.Utils.TcMType There are three steps (look at kindGeneraliseSome): 1. candidateQTyVarsOfType finds the free variables of the type or kind, to generalise 2. filterConstrainedCandidates filters out candidates that appear in the unsolved 'wanteds', and promotes the ones that get filtered out thereby. 3. quantifyTyVars quantifies the remaining type variables The kindGeneralize functions do not require pre-zonking; they zonk as they go. kindGeneraliseAll specialises for the case where step (2) is vacuous. kindGeneraliseNone specialises for the case where we do no quantification, but we must still promote. If you are actually doing kind-generalization, you need to bump the level before generating constraints, as we will only generalize variables with a TcLevel higher than the ambient one. Hence the "pushLevel" in pushLevelAndSolveEqualities.
References 3
- Promotion in signatures GHC.Tc.Gen.HsType
- Recipe for checking a signature GHC.Tc.Gen.HsType
- Naughty quantification candidates GHC.Tc.Utils.TcMType
Referenced by 3
- GHC.Tc.Gen.HsType call site ×2
- Recipe for checking a signature GHC.Tc.Gen.HsType