我知道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的值上。 这是真的吗?
答案 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
语法不是必需的,语法根本不能用于除构造函数应用程序之外的任何东西。