In functional programming, fold is a standard operator that encapsulates a simple pattern of
recursion for processing lists. This article is a tutorial on two key aspects of the fold operator
for lists. First of all, we emphasize the use of the universal property of fold both as a proof
principle that avoids the need for inductive proofs, and as a definition principle that guides
the transformation of recursive functions into definitions using fold. Secondly, we show that
even though the pattern of recursion encapsulated by fold is simple, in a language with tuples
and functions as first-class values the fold operator has greater expressive power than might
first be expected.