
On Mon, Jan 12, 2009 at 6:47 PM, Max Bolingbroke
GHC should indeed be doing so. I'm working (on and off) to work out some suitable heuristics and put the transformation into ghc -O2. There are a few wrinkles that still need sorting out, but preliminary indications are that it decreases the runtime of our standard benchmark suite, nofib, by 12% or so.
Great! In the Stream library I'm developing at http://code.haskell.org/Stream I 'closurize' (for lack of a better name) all my functions. Here are a few random examples: repeat :: a -> Stream a repeat x = repeat_x where repeat_x = x ::: repeat_x cycle :: [a] -> Stream a cycle xs = cycle_xs where cycle_xs = foldr (:::) cycle_xs xs deleteBy :: (a -> a -> Bool) -> a -> Stream a -> Stream a deleteBy eq x = deleteBy_eq_x where deleteBy_eq_x (y ::: ys) | eq x y = ys | otherwise = y ::: deleteBy_eq_x ys Closurizing the functions in Data.Stream lead to 10% to 250% speedups! Note that I follow a particular naming convention for the inner worker functions. I use the top level function name and append the 'closurized' arguments to it interspersed with underscores. regards, Bas