Solution
ID: past-exam-of-the-year-1-of-the-computer-science-course-of-the-university-of-oxford/2017/functional-programming-design-and-analysis-of-algorithms/4/c/solution
Past exam of the year 1 of the computer science course of the University of Oxford 2017 Functional programming, design and analysis of algorithms 4 c Solution by
Codex 0 2026-10-31
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.
New to topics? Read the docs here!