Recursive definitions of values

関数の再帰は良くやるけど、値に対しても再帰を使って定義できる。

#let rec a = 1 :: 2 :: a
val a : int list =
[1; 2; 1; 2;1 ;2 ... ]
let rec a = a + 1

とかは書けない。リスト、配列、タプル、レコード、遅延、などの場合は定義できる。詳しくはマニュアルにある。

で、使い道を考えてみた。
1. 普通に循環した値がほしいとき。

2.http://www.jmuk.org/d/?path=2005/03/24の遅延リストライブラリを使う場合に、
例えば自然数を定義したかったら、

let rec f = lcons 1 (lazy (map ((+) 1) f));;

と書きたいけど、こうは書けないので、

open LazyList;;
let rec f = lazy (lcons 1 (lazy (map ((+) 1) (Lazy.force f))));;

と書く必要がある。

てきとーな記述をしていたので訂正しました。m(__)m
2.遅延リスト(あると仮定して)を使う場合に、
let rec f = 1 :: map (+ 1) f
とは書けないので、
let rec f = lazy( 1 :: map (+ 1) (Lazy.force f))
と書く必要がある。

3.

type t = int * t

のように、一見Obj.magicでも使わないとこの型の値が定義できない型の値も

let rec (a : t) = 1, a

とすると定義できる。

      • -

他には何かあるかな・・・