Note [Why adding superclasses can help]
Examples of how adding superclasses can help:
Example 1
class C a b | a -> b
Suppose we want to solve
[G] C a b
[W] C a beta
Then adding [W] beta~b will let us solve it.
Example 2 (similar but using a type-equality superclass)
class (F a ~ b) => C a b
And try to sllve:
[G] C a b
[W] C a beta
Follow the superclass rules to add
[G] F a ~ b
[W] F a ~ beta
Now we get [W] beta ~ b, and can solve that.
Example (tcfail138)
class L a b | a -> b
class (G a, L a b) => C a b
instance C a b' => G (Maybe a)
instance C a b => C (Maybe a) a
instance L (Maybe a) a
When solving the superclasses of the (C (Maybe a) a) instance, we get
[G] C a b, and hence by superclasses, [G] G a, [G] L a b
[W] G (Maybe a)
Use the instance decl to get
[W] C a beta
Generate its superclass
[W] L a beta. Now using fundeps, combine with [G] L a b to get
[W] beta ~ b
which is what we want. References 0
This Note does not link to any other.
Referenced by 3
- The superclass story GHC.Tc.Solver.Dict
- Improvement from Ground Wanteds GHC.Tc.Solver.Dict
- Expanding Recursive Superclasses and ExpansionFuel GHC.Tc.Solver.Solve