foldl f e (x:ys) = foldl f (f e x) ysFor the empty list, the prefix definition immediately gives
scanl f e [] = [e]. For a nonempty list, calculate:scanl f e (x:xs)
= map (foldl f e) ([] : map (x:) (inits xs))
= e : map ((foldl f e) . (x:)) (inits xs)
= e : map (foldl f (f e x)) (inits xs)
= e : scanl f (f e x) xsThe second-to-third line uses the displayed fold equation as an equality of functions of
ys. Hence the efficient left scan is:scanl :: (b -> a -> b) -> b -> [a] -> [b]
scanl f e [] = [e]
scanl f e (x:xs) = e : scanl f (f e x) xsOn a finite input of length , fully demanding the original prefix-fold results performs accumulator updates. The recurrence performs . Thus the update count improves from to , assuming constant-cost updates. Both return results. This does not assert constant space for arbitrary accumulators or imply that lazy accumulators are evaluated strictly.
Articles by others on the same topic
There are currently no matching articles.