畳み込み関数

左からの畳み込み

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)))))