Вопрос

В Структура и интерпретация компьютерных программ (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 не был список; Например, если он представлял собой лениво сгенерированную последовательность.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top