Из Ракетки Документация , описание foldl
:
(foldl proc init lst ...+) → any/c
Упомянуты два вопроса на ваш вопрос:
входные значения пройдены слева направо
И
сложить обрабатывает последние в постоянном пространстве
Я собираюсь поразмышлять над тем, как может выглядеть реализация для этого, с одним списком для простоты:
(define (my-foldl proc init lst)
(define (iter lst acc)
(if (null? lst)
acc
(iter (cdr lst) (proc (car lst) acc))))
(iter lst init))
Как видите, требования обхода и константы слева направо выполнены (обратите внимание на хвостовую рекурсию в iter
), но порядок аргументов для proc
был никогда не указывается в описании. Следовательно, результатом вызова вышеуказанного кода будет:
(my-foldl - 0 '(1 2 3 4))
> 2
Если бы мы указали порядок аргументов для proc
следующим образом:
(proc acc (car lst))
Тогда результат будет:
(my-foldl - 0 '(1 2 3 4))
> -10
Моя точка зрения такова, что документация для foldl
не делает никаких предположений относительно порядка вычисления аргументов для proc
, она должна только гарантировать, что используется постоянное пространство и что элементы в списке оцениваются слева направо.
В качестве примечания вы можете получить желаемый порядок оценки для вашего выражения, просто написав это:
(- 0 1 2 3 4)
> -10