Proposal: Make intersperse lazier
Christian.Maeder at dfki.de
Fri Sep 24 11:55:15 EDT 2010
Am 24.09.2010 16:53, schrieb Daniel Fischer:
> However, I benchmarked some more today, and the results suggest that
> intersperse :: a -> [a] -> [a]
> intersperse _  = 
> intersperse s (x:xs) = x : foo s xs
> foo :: a -> [a] -> [a]
> foo s (x:xs) = s : x : foo s xs
> foo _  = 
> is a little faster than the SATed isgo (about 4-5% in the benchmark).
> Compiled with optimisations, it makes no difference whether foo (of course
> we need a better name) is a top-level function or local to intersperse, but
> without optimisations, a top-level function is better.
> Also nice is that that gives identical core for all optimisation levels
> (0,1,2) [apart from the strictness/unfolding information, which is absent
> with -O0].
> (Tested with 6.12.3 and HEAD.)
> So far, the above is IMO the best implementation.
> A good name for foo remains to be found.
> I don't like 'prepend' because prepend suggests only putting something
> before a list (with the given type, it should be (:)) and not changing
> anything inside.
> If it's not to be exported from Data.List (and I don't consider it useful
> enough to be), maybe intersperseLoop wouldn't be too daft.
I consider it useful, because the "natural" implementation:
prependToAll s = foldr (\ x r -> s : x : r) 
seems to leak without optimization.
More information about the Libraries