• Simon Peyton Jones's avatar
    Improve improvement in the constraint solver · a1275a76
    Simon Peyton Jones authored
    This regrettably-big patch substantially improves the way in which
    "improvement" happens in the constraint solver.  It was triggered by
    trying to crack Trac #10009, but it turned out to solve #10340 as
    The big picture, with several of the trickiest examples, is described
    in Note [The improvement story] in TcInteract.
    The major change is this:
    * After solving we explicitly try "improvement", by
         - making the unsolved Wanteds into Deriveds
         - allowing Deriveds to rewrite Deriveds
      This more aggressive rewriting "unlocks" some extra
      guess-free unifications.
    * The main loop is in TcInteract.solveSimpleWanteds, but I also ended
      up refactoring TcSimplify.simpl_loop, and its surrounding code.
      Notably, any insolubles from the Givens are pulled out
      and treated separately, rather than staying in the inert set
      during the solveSimpleWanteds loop.
    There are a lot of follow-on changes
    * Do not emit generate Derived improvements from Wanteds.
      This saves work in the common case where they aren't needed.
    * For improvement we should really do type-class reduction on Derived
      constraints in doTopReactDict.  That entailed changing the GenInst
      constructor a bit; a local and minor change
    * Some annoying faffing about with dropping derived constraints;
      see dropDerivedWC, dropDerivedSimples, dropDerivedInsols,
      and their Notes.
    * Some substantial refactoring in TcErrors.reportWanteds.
      This work wasn't strictly forced, but I got sucked into it.
      All the changes are in TcErrors.
    * Use TcS.unifyTyVar consistently, rather than setWantedTyBind,
      so that unifications are properly tracked.
    * Refactoring around solveWantedsTcM, solveWantedsAndDrop.
      They previously guaranteed a zonked result, but it's more
      straightforward for clients to zonk.
TcInteract.hs 90 KB