Note [Speeding up valid hole-fits]
To fix #16875 we noted that a lot of time was being spent on unnecessary work. When we'd call `tcCheckHoleFit hole hole_ty ty`, we would end up by generating a constraint to show that `hole_ty ~ ty`, including any constraints in `ty`. For example, if `hole_ty = Int` and `ty = Foldable t => (a -> Bool) -> t a -> Bool`, we'd have `(a_a1pa[sk:1] -> Bool) -> t_t2jk[sk:1] a_a1pa[sk:1] -> Bool ~# Int` from the coercion, as well as `Foldable t_t2jk[sk:1]`. By adding a flag to `TcSEnv` and adding a `runTcSEarlyAbort`, we can fail as soon as we hit an insoluble constraint. Since we don't need the result in the case that it fails, a boolean `False` (i.e. "it didn't work" from `runTcSEarlyAbort`) is sufficient. We also check whether the type of the hole is an immutable type variable (i.e. a skolem). In that case, the only possible fits are fits of exactly that type, which can only come from the locals. This speeds things up quite a bit when we don't know anything about the type of the hole. This also helps with degenerate fits like (`id (_ :: a)` and `head (_ :: [a])`) when looking for fits of type `a`, where `a` is a skolem.
References 0
This Note does not link to any other.
Referenced by 3
- GHC.Tc.Errors.Hole call site
- GHC.Tc.Solver.Monad call site
- TcSMode GHC.Tc.Solver.Monad