Hi All,
I was looking at the definition of intersperse on
http://hackage.haskell.org/package/base-4.7.0.1/docs/src/Data-List.html#intersperse
And found this
-- | The 'intersperse' function takes an element and a list and
-- \`intersperses\' that element between the elements of the list.
-- For example,
--
-- > intersperse ',' "abcde" == "a,b,c,d,e"
intersperse :: a -> [a] -> [a]
intersperse _ [] = []
intersperse sep (x:xs) = x : prependToAll sep xs
-- Not exported:
-- We want to make every element in the 'intersperse'd list
available
-- as soon as possible to avoid space leaks. Experiments suggested
that
-- a separate top-level helper is more efficient than a local
worker.
prependToAll :: a -> [a] -> [a]
prependToAll _ [] = []
prependToAll sep (x:xs) = sep : x : prependToAll sep xs
I don't understand why we need to "make every element in the
'intersperse'd list available as soon as possible to avoid space
leaks." Could somebody shed some light on what could cause a space
leak here? In particular, would this simpler version cause problems?
intersperse :: a -> [a] -> [a]
intersperse _ [] = []
intersperse _ [x] = [x]
intersperse a (x: xs@(y:ys)) = x : a : intersperse a xs
Thanks,
Dimitri