Skip to content
  • Simon Peyton Jones's avatar
    Do eager instantation in terms · ffde2348
    Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
    This patch implements eager instantiation, a small but critical change
    to the type inference engine, #17173.  The main change is this:
    
      When inferring types, always return an instantiated type
      (for now, deeply instantiated; in future shallowly instantiated)
    
    There is more discussion in
    https://www.tweag.io/posts/2020-04-02-lazy-eager-instantiation.html
    
    There is quite a bit of refactoring in this patch:
    
    * The ir_inst field of GHC.Tc.Utils.TcType.InferResultk
      has entirely gone.  So tcInferInst and tcInferNoInst have collapsed
      into tcInfer.
    
    * Type inference of applications, via tcInferApp and
      tcInferAppHead, are substantially refactored, preparing
      the way for Quick Look impredicativity.
    
    * New pure function GHC.Tc.Gen.Expr.collectHsArgs and applyHsArgs
      are beatifully dual.  We can see the zipper!
    
    * GHC.Tc.Gen.Expr.tcArgs is now much nicer; no longer needs to return
      a wrapper
    
    * In HsExpr, HsTypeApp now contains the the actual type argument,
      and is used in desugaring, rather than putting it in a mysterious
      wrapper.
    
    * I struggled a bit with good error reporting in
      Unify.matchActualFunTysPart. It's a little bit simpler than before,
      but still not great.
    
    Some smaller things
    
    * Rename tcPolyExpr --> tcCheckExpr
             tcMonoExpr --> tcLExpr
    * tcPatSig moves from GHC.Tc.Gen.HsType to GHC.Tc.Gen.Pat
    
    Metric Decrease:
        T9961
    
    Reduction of 1.6% in comiler allocation on T9961, I think.
    ffde2348