Глава 12 Расширения языка
1 Рекурсивные определения значений
(Введено в Objective Caml 1.00)
Как упоминалось в разделе 11.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:
Выражение e называется непосредственно связанным с переменной name в следующих случаях:
© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/letrecvalues.html