Note [HasGivenEqs]
The GivenEqs data type describes the Given constraints of an implication constraint: * NoGivenEqs: definitely no Given equalities, except perhaps let-bound skolems which don't count: see Note [Let-bound skolems] in GHC.Tc.Solver.InertSet Examples: forall a. Eq a => ... forall a. (Show a, Num a) => ... forall a. a ~ Either Int Bool => ... -- Let-bound skolem * LocalGivenEqs: definitely no Given equalities that would affect principal types. But may have equalities that affect only skolems of this implication (and hence do not affect principal types) Examples: forall a. F a ~ Int => ... forall a b. F a ~ G b => ... * MaybeGivenEqs: may have Given equalities that would affect principal types Examples: forall. (a ~ b) => ... forall a. F a ~ b => ... forall a. c a => ... -- The 'c' might be instantiated to (b ~) forall a. C a b => .... where class x~y => C a b so there is an equality in the superclass of a Given The HasGivenEqs classifications affect two things: * Suppressing redundant givens during error reporting; see GHC.Tc.Errors Note [Suppress redundant givens during error reporting] * Floating in approximateWC. Specifically, here's how it goes: Stops floating | Suppresses Givens in errors in approximateWC | NoGivenEqs NO | YES LocalGivenEqs NO | NO MaybeGivenEqs YES | NO
References 2
- Suppress redundant givens during error reporting GHC.Tc.Errors
- Let-bound skolems GHC.Tc.Solver.InertSet
Referenced by 3
- Tracking Given equalities GHC.Tc.Solver.InertSet
- GHC.Tc.Solver.Monad call site
- GHC.Tc.Types.Constraint call site