summaryrefslogtreecommitdiff
path: root/compiler/typecheck/Flattening-notes
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2014-11-03 17:23:11 +0000
committerSimon Peyton Jones <simonpj@microsoft.com>2014-11-04 10:38:08 +0000
commit5770029a1f8509a673b2277287fc8fe90b9b6002 (patch)
treeb211edd4ad3dea9b367b39a3aa7e36436ce08f25 /compiler/typecheck/Flattening-notes
parentce9d6f251f9764f769f5ebd8c6130809b6b0d159 (diff)
downloadhaskell-5770029a1f8509a673b2277287fc8fe90b9b6002.tar.gz
Simon's major commit to re-engineer the constraint solver
The driving change is this: * The canonical CFunEqCan constraints now have the form [G] F xis ~ fsk [W] F xis ~ fmv where fsk is a flatten-skolem, and fmv is a flatten-meta-variable Think of them as the name of the type-function application See Note [The flattening story] in TcFlatten. A flatten-meta-variable is distinguishable by its MetaInfo of FlatMetaTv This in turn led to an enormous cascade of other changes, which simplify and modularise the constraint solver. In particular: * Basic data types * I got rid of inert_solved_funeqs altogether. It serves no useful role that inert_flat_cache does not solve. * I added wl_implics to the WorkList, as a convenient place to accumulate newly-emitted implications; see Note [Residual implications] in TcSMonad. * I eliminated tcs_ty_binds altogether. These were the bindings for unification variables that we have now solved by unification. We kept them in a finite map and did the side-effecting unification later. But in cannonicalisation we had to look up in the side-effected mutable tyvars anyway, so nothing was being gained. Our original idea was that the solver would be pure, and would be a no-op if you discarded its results, but this was already not-true for implications since we update their evidence bindings in an imperative way. So rather than the uneasy compromise, it's now clearly imperative! * I split out the flatten/unflatten code into a new module, TcFlatten * I simplified and articulated explicitly the (rather hazy) invariants for the inert substitution inert_eqs. See Note [eqCanRewrite] and See Note [Applying the inert substitution] in TcFlatten * Unflattening is now done (by TcFlatten.unflatten) after solveFlats, before solving nested implications. This turned out to simplify a lot of code. Previously, unflattening was done as part of zonking, at the very very end. * Eager unflattening allowed me to remove the unpleasant ic_fsks field of an Implication (hurrah) * Eager unflattening made the TcSimplify.floatEqualities function much simpler (just float equalities looking like a ~ ty, where a is an untouchable meta-tyvar). * Likewise the idea of "pushing wanteds in as givens" could be completely eliminated. * I radically simplified the code that determines when there are 'given' equalities, and hence whether we can float 'wanted' equalies out. See TcSMonad.getNoGivenEqs, and Note [When does an implication have given equalities?]. This allowed me to get rid of the unpleasant inert_no_eqs flag in InertCans. * As part of this given-equality stuff, I fixed Trac #9211. See Note [Let-bound skolems] in TcSMonad * Orientation of tyvar/tyvar equalities (a ~ b) was partly done during canonicalisation, but then repeated in the spontaneous-solve stage (trySpontaneousSolveTwoWay). Now it is done exclusively during canonicalisation, which keeps all the code in one place. See Note [Canonical orientation for tyvar/tyvar equality constraints] in TcCanonical
Diffstat (limited to 'compiler/typecheck/Flattening-notes')
-rw-r--r--compiler/typecheck/Flattening-notes13
1 files changed, 2 insertions, 11 deletions
diff --git a/compiler/typecheck/Flattening-notes b/compiler/typecheck/Flattening-notes
index 5f6fd140c8..ec4565ccf5 100644
--- a/compiler/typecheck/Flattening-notes
+++ b/compiler/typecheck/Flattening-notes
@@ -2,22 +2,13 @@ ToDo:
* get rid of getEvTerm?
-* Float only CTyEqCans. kind-incompatible things should be CNonCanonical,
- so they won't float and generate a duplicate kind-unify message
-
- Then we can stop disabling floating when there are insolubles,
- and that will improve mc21 etc
-
-* Note [Do not add duplicate derived isols]
- This mostly doesn't apply now, except for the fundeps
-
* inert_funeqs, inert_eqs: keep only the CtEvidence.
They are all CFunEqCans, CTyEqCans
-* remove/rewrite TcMType Note [Unflattening while zonking]
-
* Consider individual data tpyes for CFunEqCan etc
+* Collapes CNonCanonical and CIrredCan
+
Remaining errors
============================
Unexpected failures: