Next: lists fold unfold, Previous: lists fold pair, Up: lists fold [Index]
reduce
is a variant of fold
. ridentity should be a
“right identity” of the procedure f; that is, for any value
x acceptable to f:
(f x ridentity) ≡ x
reduce
has the following definition:
if list = (), return ridentity; otherwise, return (fold f (car list) (cdr list)).
in other words, we compute (fold f ridentity list)
.
Note that ridentity is used only in the empty–list case.
We typically use reduce
when applying f is expensive and we
would like to avoid the extra application incurred when fold
applies f to the head of list and the identity value, redundantly
producing the same value passed in to f. For example, if f
involves searching a file directory or performing a database query, this
can be significant. In general, however, fold
is useful in many
contexts where reduce
is not.
Examples:
;; take the max of a list of non-negative integers (reduce max 0 '(1 2 3 4 5 6)) ⇒ 6 (reduce + 0 '(0 1 2 3 4 5 6 7 8 9)) ⇒ 45
reduce*
is the fold*
variant of
reduce
. It obeys the following definition:
(reduce* f ridentity '()) ≡ ridentity (reduce* f ridentity '(e1)) ≡ (f e1 ridentity) ≡ e1 (reduce* f ridentity '(e1 e2 ...)) ≡ (f e1 (reduce f ridentity (e2 ...)))
in other words, we compute (fold* f ridentity list)
.
;; append a bunch of lists together (reduce* append '() '((1 2 3) (4 5) (6 7 8 9) (0))) ⇒ (1 2 3 4 5 6 7 8 9 0)
Next: lists fold unfold, Previous: lists fold pair, Up: lists fold [Index]