2013年8月15日木曜日

fold と unfold (gauche)

リスト(1 2 3)というものは次のようにして構成されます。

(cons 1 (cons 2 (cons 3 '())))

(cons a b) を (a . b) と書くことにすれば、

(1 . (2 . (3 . '())))

です。ところで、自然数123というのは、通常10進法で表記しているわけですが、これは次のようにして定義されています。

3 + 10*( 2 + 10*(1 + 10*0)))

似ていますね。このような対象同士を相互に変換するのがfold とunfold-right です。

(fold (lambda (a b) (+ (* b 10) a )) 0 '(1 2 3)) ==> 123
(unfold-right zero? (lambda (n) (modulo n 10))
                    (lambda (n) (quotient n 10))
                    123)                         ==> (1 2 3)

unfold だとリストの構造上逆に表記されます。その場合fold-right で元に戻ります。
(unfold zero? (lambda (n) (modulo n 10))
              (lambda (n) (quotient n 10))
              123)                                     ==> (3 2 1)
(fold-right (lambda (a b) (+ (* b 10) a )) 0 '(3 2 1)) ==> 123

0 件のコメント:

コメントを投稿