Да. По определению левой складки функция объединения вызывается с первым элементом списка и с накопленным результатом на данный момент , и результат этого вызова передается (как новый (обновил накопленный результат) до рекурсивного вызова foldl
с той же функцией объединения и остальной частью списка:
(foldl cons <b>'()</b> '(1 2 3))
=
(foldl cons <b>(cons 1</b> '()<b>)</b> '(2 3))
=
(foldl cons <b>(cons 2</b> (cons 1 '())<b>)</b> '(3))
=
(foldl cons <b>(cons 3</b> (cons 2 (cons 1 '()))<b>)</b> '())
=
(cons 3 (cons 2 (cons 1 '())))
И когда список пуст, накопленный результат пока возвращается в качестве окончательного результата.
К вашему второму вопросу, функции variadi c в схеме указываются с точкой .
в списке аргументов, например:
(define (fold-left f acc <b>. lists</b>)
(if (null? (first <b>lists</b>)) ;; assume all have same length
acc
(apply fold-left ;; recursive call
f
(apply f (append (map first <b>lists</b>) ;; combine first elts
(list acc))) ;; with result so far
(map rest <b>lists</b>)))) ;; the rests of lists
Действительно,
(fold-left (lambda (a b result)
(* result (- a b)))
1
'(1 2 3)
'(4 5 6))
возвращает -27
.