Вопрос
В Структура и интерпретация компьютерных программ (SICP) Раздел 2.2.3. Несколько функций определены с использованием:
(accumulate cons nil
(filter pred
(map op sequence)))
Два примера, которые используют это, работают в списке чисел Фибоначчи, even-fibs
а также list-fib-squares
.
Функции накапливания, фильтра и карты определены в разделе 2.2. Часть, которая путает меня, поэтому авторы включали accumulate
здесь. accumulate
занимает 3 параметра:
Двоичная функция для применения
Начальное значение, используемое в качестве самого правого параметра к функции
Список, к которому будет применена функция
Пример применения накапливается в список с использованием определения в книге:
(accumulate cons nil (list 1 2 3))
=> (cons 1 (cons 2 (cons 3 nil)))
=> (1 2 3)
Поскольку третий параметр является списком, (accumulate cons nil some-list)
просто вернутся some-list
, и в этом случае результат (filter pred (map op sequence))
это список.
Есть ли причина для этого использования accumulate
кроме последовательности с другими аналогичными структурированными функциями в разделе?
Решение
Я уверен, что эти два применения accumulate
Являются ли просто иллюстрацией того факта, что «консистентные элементы для построения списка» можно рассматривать как накопительный процесс таким же образом, что «умножая числа для получения продукта» или «суммирующие номера для получения общего». Вы правы, что накопление эффективно является неоперативным.
(В сторону: обратите внимание, что это, очевидно, может быть более полезной операцией, если вывод filter
и ввод accumulate
не был список; Например, если он представлял собой лениво сгенерированную последовательность.)