performance regressions

Jan Stolarek jan.stolarek at
Tue Dec 16 07:59:41 UTC 2014

> Using this combinator instead of writing the algorithm directly cost me 30%
> allocation overhead!
What does your algorithm look like when you write it directly? Something like this:

flatten_many fmode roles tys
 = unzip `liftM` mapM go (zip roles tys)
   go (Nominal,ty)          = flatten_one (fmode { fe_eq_rel = NomEq }) ty
   go (Representational,ty) = flatten_one (fmode { fe_eq_rel = ReprEq }) ty
   go (Phantom, ty)         = -- See Note [Phantoms in the flattener]
                              return (ty, mkTcPhantomCo ty ty)


Maybe this has something to do with `zipWithAndUnzipM` not being tail-recursive vs. direct version 
being able to fuse intermediate lists?


More information about the ghc-devs mailing list