(OCaml 1.00 〜)
「局所定義 」 で触れた通り、 let rec
構文では、再帰関数の定義に加えて、関数以外の特定のクラスの値の再帰的定義もサポートしています。例えば、
let rec name1 = 1 :: name2 and name2 = 2 :: name1 in expr
は、 name1 に循環リスト 1::2::1::2::...
を束縛し、 name2 に 2::1::2::1::...
を束縛します。非形式的に言えば、受け付けられる定義のクラスは、定義される名前が関数本体の内部か、データ構成子の引数としてだけ現れるようなものです。
より精確には、次の式で、
let rec name1 = expr1 and and namen
= exprn
in expr
各 expr1 ... exprn
が name1 ... namen
に関して静的に構成され、かつ、 name1 ... namen
のいずれにも直接リンクせず、各式が引数の型が抽象型である配列構成子でないとき、この定義は受け付けられます。
式 e が変数 name1 ... namen
について静的に構築されるとは、次の条件の少なくともひとつを満たす場合を言います。
式 e が変数 name に直接リンクされるとは次の場合を言います。