unfoldのメモ

unfoldが便利っぽい。メモメモ

gaucheのマニュアルを見ると、

Function: unfold p f g seed &optional tail-gen
    [SRFI-1] 基本リスト再帰構築子です。以下のように再帰的に定義されています。

    (unfold p f g seed tail-gen) ==
       (if (p seed)
           (tail-gen seed)
           (cons (f seed)
                 (unfold p f g (g seed))))

Function: unfold-right p f g seed &optional tail
    [SRFI-1] 基本リスト反復構築子です。以下のように再帰的に定義されています。

    (unfold-right p f g seed tail) ==
      (let lp ((seed seed) (lis tail))
        (if (p seed)
            lis
            (lp (g seed) (cons (f seed) lis))))

イマイチわかりにくいけど、要約すると、

(unfold 終わり 作用させるやつ 減らすやつ )

ということらしい。


お試し。

(unfold zero?  values (lambda (n) (- n 1)) 10) ; (10 9 8 7 6 5 4 3 2 1)

10,9,8,7...あぁ、なるほど。

unfold-rightで逆順に

(unfold-right zero?  values (lambda (n) (- n 1)) 10) ; (1 2 3 4 5 6 7 8 9 10)

うは便利。


seedにリストを入れることも出来るので応用範囲はfold以上に広いかもしれない。

mapみたいに。

(unfold null? car cdr (iota 10)) ; (0 1 2 3 4 5 6 7 8 9)

reverse。

(unfold-right null? car cdr (iota 10)) ; (9 8 7 6 5 4 3 2 1 0)

楽しい。


unfoldは「何か」からリストを作り出せると。


これは使えそうだ。