左からの畳み込み
Scheme には左から畳み込む関数が2つある。fold と fold-left だ。違いは引数の関数に渡される引数の順序。次の例がわかり易い。
gosh> (fold list 0 '(1 2 3 4 5)) (5 (4 (3 (2 (1 0)))))
gosh> (fold-left list 0 '(1 2 3 4 5)) (((((0 1) 2) 3) 4) 5)
Haskell の foldl にあたるのが fold-left だな。
fold を使うと昨日書いた reverse がもっと簡単になる。
gosh> (define reverse (lambda (lis) (fold cons '() lis))) reverse gosh> (reverse '(1 2 3 4)) (4 3 2 1)
右からの畳み込み
fold-right は右から畳み込む。
gosh> (fold-right list 0 '(1 2 3 4 5)) (1 (2 (3 (4 (5 0)))))