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)
仮定
- 私たちは、codata の簡潔な定義を「Codata は、無限の可能性がある値が存在する型である」と考えています。
- この Clojure の例は (core.typed からの) 静的型システムを使用していないため、codata の記述はすべて「作業定義」です。
私の質問は - 上記の関数のどの部分が「codata」ですか。無名関数ですか?それは怠惰なシーケンスですか?