Note [Local implicit parameters]
See also wrinkle (SIP1) in Note [Shadowing of implicit parameters] in GHC.Tc.Solver.Dict. The function couldBeIPLike tells if this predicate, or any of its superclasses, is an implicit parameter. Why are implicit parameters special? Unlike normal classes, we can have local instances for implicit parameters, in the form of let ?x = True in ... So in various places we must be careful not to assume that any value of the right type will do; we must carefully look for the innermost binding. So couldBeIPLike checks whether this is an implicit parameter, or has a superclass that is an implicit parameter. Several wrinkles * We must be careful with superclasses, as #18649 showed. Haskell doesn't allow an implicit parameter as a superclass class (?x::a) => C a where ... but with a constraint tuple we might have (% Eq a, ?x::Int %) and /its/ superclasses, namely (Eq a) and (?x::Int), /do/ include an implicit parameter. With ConstraintKinds this can apply to /any/ class, e.g. class sc => C sc where ... Then (C (?x::Int)) has (?x::Int) as a superclass. So we must instantiate and check each superclass, one by one, in hasIPSuperClasses. * With -XUndecidableSuperClasses, the superclass hunt can go on forever, so we need a RecTcChecker to cut it off. * Another apparent additional complexity involves type families. For example, consider type family D (v::*->*) :: Constraint type instance D [] = () f :: D v => v Char -> Int If we see a call (f "foo"), we'll pass a "dictionary" () |> (g :: () ~ D []) and it's good to specialise f at this dictionary. So the question is: can an implicit parameter "hide inside" a type-family constraint like (D a). Well, no. We don't allow type instance D Maybe = ?x:Int Hence the umbrella 'otherwise' case in is_ip_like_pred. See #7785. Small worries (Sept 20): * I don't see what stops us having that 'type instance'. Indeed I think nothing does. * I'm a little concerned about type variables; such a variable might be instantiated to an implicit parameter. I don't think this matters in the cases for which couldBeIPLike is used, and it's pretty obscure anyway. * The superclass hunt stops when it encounters the same class again, but in principle we could have the same class, differently instantiated, and the second time it could have an implicit parameter I'm going to treat these as problems for another day. They are all exotic.
References 1
- Shadowing of implicit parameters GHC.Tc.Solver.Dict
Referenced by 4
- GHC.Core.Predicate call site ×3
- Shadowing of implicit parameters GHC.Tc.Solver.Dict