第 12 章 语言扩展

1 值的递归定义

(在 Objective Caml 1.00 中引入)

如第 ‍11.7.2 节所述,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 andand namen = exprn in expr

如果 expr1exprn 中的每一个对 name1namen 来说是静态构造的,并且不直接链接到 name1namen 中的任何一个,并且不是其参数具有抽象类型的数组构造函数,则它将被接受。

如果至少满足以下条件之一,则表达式 e 被称为变量 name1namen静态构造的

如果满足以下情况,则表达式 e 被称为直接链接到变量 name