foldとfold-rightとapplyの違い

混乱しかけたので覚え書き。fold系(SRFI-1)とapplyはそもそも意味が違う。foldはリストの畳み込みを行うのに対し、applyはリストの要素を引数として手続きを呼ぶ

(fold       + 1 '(2 3 4))
(fold-right + 1 '(2 3 4))
(apply      + 1 '(2 3 4))
=> 10
=> 10
=> 10

(fold       append '() '((1 2) (3 4)))
(fold-right append '() '((1 2) (3 4)))
(apply      append '() '((1 2) (3 4)))
=> (3 4 1 2)
=> (1 2 3 4)
=> (1 2 3 4)

(fold       append '(0) '((1 2) (3 4)))
(fold-right append '(0) '((1 2) (3 4)))
(apply      append '(0) '((1 2) (3 4)))
=> (3 4 1 2 0)
=> (1 2 3 4 0)
=> (0 1 2 3 4)

(fold       list '0 '(1 2 3 4))
(fold-right list '0 '(1 2 3 4))
(apply      list '0 '(1 2 3 4))
=> (4 (3 (2 (1 0))))
=> (1 (2 (3 (4 0))))
=> (0 1 2 3 4)

参考:畳み込み関数の比較 (fold / accumulate / inject / reduce)


おまけ

(apply + 1 2 3 4 '())
=> 10

素直に (+ 1 2 3 4) って書けっていう…