10.1 Рекурсивные определения значений
(Введено в Objective Caml 1.00)
Как упоминалось в разделе 9.7.2, конструкция связывания let rec, помимо определения рекурсивных функций, также поддерживает определённый класс рекурсивных определений нефункциональных значений, таких как
который связывает name1 со циклическим списком 1::2::1::2::…, а name2 – со циклическим списком 2::1::2::1::…Неформально, класс допускаемых определений состоит из тех определений, где имена определений встречаются только внутри тел функций или в качестве аргумента конструктору данных.
Более точно, рассмотрим выражение:
Оно будет принято, если каждое из expr1 … exprn является статически конструктивным относительно name1 … namen, не связано непосредственно ни с одним из name1 … namen и не является конструктором массива, чьи аргументы имеют абстрактный тип.
Выражение e называется статически конструктивным относительно переменных name1 … namen, если выполняется хотя бы одно из следующих условий:
- e не содержит свободных вхождений ни одной из name1 … namen
- e является переменной
- e имеет вид fun … -> …
- e имеет вид function … -> …
- e имеет вид lazy ( … )
-
e имеет один из следующих видов, где каждое из expr1 … exprm является статически конструктивным относительно name1 … namen, а expr0 статически конструктивно относительно name1 … namen, xname1 … xnamem:
- let [rec] xname1 = expr1 and … and xnamem = exprm in expr0
- let module … in expr1
- constr (expr1, … , exprm)
- `tag-name (expr1, … , exprm)
- [| expr1; … ; exprm |]
- { field1 = expr1; … ; fieldm = exprm }
- { expr1 with field2 = expr2; … ; fieldm = exprm } где expr1 не связано непосредственно с name1 … namen
- ( expr1, … , exprm )
- expr1; … ; exprm
Выражение e называется непосредственно связанным с переменной name в следующих случаях:
- e есть name
- e имеет вид expr1; … ; exprm, где exprm непосредственно связано с name
- e имеет вид let [rec] xname1 = expr1 and … and xnamem = exprm in expr0, где expr0 непосредственно связано с name или с одним из xnamei, при условии что expri непосредственно связано с name.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/letrecvalues.html