SICP Накопить функцию - PullRequest
       8

SICP Накопить функцию

3 голосов
/ 09 сентября 2010

In Структура и интерпретация компьютерных программ (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, кроме согласованности с другими аналогично структурированными функциями в разделе?

1 Ответ

5 голосов
/ 09 сентября 2010

Я уверен, что эти два использования accumulate являются просто иллюстрацией того факта, что «составные элементы для построения списка» могут рассматриваться как накопительный процесс так же, как «умножение чисел для получения продукта»или «суммирование чисел для получения итога» можно.Вы правы в том, что накопление фактически не используется.

(Обратите внимание: очевидно, что это может быть более полезной операцией, если выходные данные filter и входные данные accumulate не были списком; например, если он представляет собой лениво сгенерированную последовательность.)

...