SICP Накопить функцию
В разделе 2.2.3 " Структура и интерпретация компьютерных программ" (SICP) несколько функций определены с использованием:
(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
кроме согласованности с другими аналогично структурированными функциями в разделе?
1 ответ
Я уверен, что эти два использования accumulate
являются просто иллюстрацией того факта, что "составляющие элементы для построения списка" могут рассматриваться как накопительный процесс таким же образом, как "умножение чисел для получения продукта" или "суммирование чисел для получения итога". Вы правы в том, что накопление по сути дела не является операцией.
(В сторону: обратите внимание, что это, очевидно, может быть более полезной операцией, если вывод filter
и ввод accumulate
не было списка; например, если он представляет лениво сгенерированную последовательность.)