7.3 値の再帰的定義

(OCaml 1.00 〜)

「局所定義 」 で触れた通り、 let rec 構文では、再帰関数の定義に加えて、関数以外の特定のクラスの値の再帰的定義もサポートしています。例えば、

let rec name1 = 1 :: name2 and name2 = 2 :: name1 in expr

は、 name1 に循環リスト 1::2::1::2::... を束縛し、 name22::1::2::1::... を束縛します。非形式的に言えば、受け付けられる定義のクラスは、定義される名前が関数本体の内部か、データ構成子の引数としてだけ現れるようなものです。

より精確には、次の式で、

let rec name1 = expr1 and ... and namen = exprn in expr

expr1 ... exprnname1 ... namen に関して静的に構成され、かつ、 name1 ... namen のいずれにも直接リンクせず、各式が引数の型が抽象型である配列構成子でないとき、この定義は受け付けられます。

e が変数 name1 ... namen について静的に構築されるとは、次の条件の少なくともひとつを満たす場合を言います。

e が変数 name直接リンクされるとは次の場合を言います。