5

Clojure で無限遅延フィボナッチ数列を与える次の関数を想像してください。

(def fib-seq
  (concat
   [0 1]
   ((fn rfib [a b]
        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))

user> (take 20 fib-seq)
(0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181)

仮定

  1. 私たちは、codata の簡潔な定義を「Codata は、無限の可能性がある値が存在する型である」と考えています。
  2. この Clojure の例は (core.typed からの) 静的型システムを使用していないため、codata の記述はすべて「作業定義」です。

私の質問は - 上記の関数のどの部分が「codata」ですか。無名関数ですか?それは怠惰なシーケンスですか?

4

2 に答える 2

0

私の個人的な考えでは、lazy-cons への呼び出しの戻り値は、問題の型が最初に無限であると言えるポイントであり、したがって、それが codata'nes の開始点であると考えています。

于 2013-07-12T17:27:31.183 に答える