新関数を考えてみた

unfoldは便利なんだけど、cons邪魔杉なので新関数unを考えてみた。

(define (un p tail f seed)
  (if (p seed)
      (tail seed)
      (f seed (lambda (x)
                (un p tail f x)))))

fは2個の引数、seedと手続きを取るようにする。


リストのコピー。

(un null?
    values
    (lambda (x g)
      (cons (car x)
            (g (cdr x))))
    (iota 10)) ; (0 1 2 3 4 5 6 7 8 9)

0から10まで足す。

(un zero?
    values
    (lambda (x g)
      (+ x (g (- x 1))))
    10) ; 55

フィボナッチ(f(0) = 1, f(1) = 1)

(un (lambda (x)
      (or (zero? x) (= x 1)))
    (lambda (x) 1)
    (lambda (x g)
      (+ (g (- x 1))
         (g (- x 2))))
    10) ; 89

イイ!!


が・・・ふつうに書いた方が楽かも。もうちょい練ってみる。

バージョン2

unのバージョン2を考えてみた。ifイラナイ!!

(define (un f seed)
  (f seed (lambda (x)
            (un f x))))

ふふ。最強だぜ。

フィボナッチだって書ける。(f(0) = 0, f(1) = 1)

(un (lambda (x g)
      (cond ((zero? x) 0)
            ((= x 1) 1)
            (else
              (+ (g (- x 1))
                 (g (- x 2))))))
    10)

再帰なら何でも来い!!


って・・・よく見たらletrecと変わらないじゃないか!!


ということでunの開発終了。車輪の開発はムズカシイ。