> 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)
 where
   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?

Janek
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs

Reply via email to