OCaml中的相互递归定义

时间:2014-07-15 11:39:14

标签: binding ocaml

我知道OCaml提供了let rec ... and ...来定义相互递归函数。为什么我不能使用该表达式来定义相互递归的值?

特别是,为什么我不能做let rec x=3 and y=x+5 in x之类的事情,但我能做let rec x=3 and y=[x;4] in y

对于第一种情况,我试着给我一个答案,我认为这是一个约束问题",因为值的绑定应该是同时的,所以你可以&#39 ; t知道x的值,所以我不能将它加到常数5的值上。 这是真的吗?

1 个答案:

答案 0 :(得分:2)

您的定义都不是相互递归的。你也可以这样写:

let x = 3 in
let y = x + 5 in
x

let x = 3 in
let y = [x; 4] in
y

相互递归的定义如下所示:

let rec x = y + 3
and y = x + 5 in
x

let rec x = 3 :: y
and y = 4:: x in
x

在第二段代码x中是一个循环列表,其中包含一个3后跟一个4然后循环回到开头。然而,第一段代码没有任何意义。当x等于y + 3时,y如何等于x + 5?它不能,因此只能使用变量类型的构造函数来定义递归值(因为这是递归值不会导致无限递归的唯一情况)。

因为,在没有构造函数的情况下无法定义递归值,并且当您尝试定义的值不是递归时,let rec ... and语法不是必需的,语法根本不能用于除构造函数应用程序之外的任何东西。