Binding OCaml中的互递归定义

Binding OCaml中的互递归定义,binding,ocaml,Binding,Ocaml,我知道OCaml提供了let rec。。。和…用于定义相互递归函数。为什么我不能用这个表达式来定义递归值 特别是,为什么我不能在x中执行类似于让rec x=3和y=x+5的操作,但我可以在y中执行让rec x=3和y=[x;4] 对于第一种情况,我试着给我一个答案,我认为这是一个绑定“问题”,因为值的绑定应该是同时的,所以y不能知道x的值,所以我不能把它加到常数5的值上。 这是真的吗?您的两个定义都不是相互递归的。你也可以这样写: let x = 3 in let y = x + 5 in x

我知道OCaml提供了
let rec。。。和…
用于定义相互递归函数。为什么我不能用这个表达式来定义递归值

特别是,为什么我不能在x中执行类似于
让rec x=3和y=x+5的操作,但我可以在y中执行
让rec x=3和y=[x;4]

对于第一种情况,我试着给我一个答案,我认为这是一个绑定“问题”,因为值的绑定应该是同时的,所以y不能知道x的值,所以我不能把它加到常数5的值上。
这是真的吗?

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

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

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

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

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


因此,由于没有构造函数和
let rec。。。当您试图定义的值不是递归的时,语法是不必要的,语法只能用于构造函数应用程序。

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

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

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

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

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


因此,由于没有构造函数和
let rec。。。当您试图定义的值不是递归的时,语法是不必要的,语法只能用于构造函数应用程序。

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

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

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

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

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


因此,由于没有构造函数和
let rec。。。当您试图定义的值不是递归的时,语法是不必要的,语法只能用于构造函数应用程序。

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

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

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

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

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


因此,由于没有构造函数和
let rec。。。当您试图定义的值不是递归值时,语法是不必要的,语法只能用于构造函数应用程序。

好的,实际上我的示例并不是相互定义的。所以,如果我理解了你的意思,我的第一个例子不起作用,因为整数不能用
let rec。。。还有…
表达式,因为它们不是变量。问题并不在于
x
是一个整数,而在于
+
是一个函数,因此不是“静态构造的”。有关递归值限制的完整说明,请参阅手册的第页。@LeoWhite您是对的-我的错。现在应该解决了。好吧,实际上我的例子并不是相互定义的。所以,如果我理解了你的意思,我的第一个例子不起作用,因为整数不能用
let rec。。。还有…
表达式,因为它们不是变量。问题并不在于
x
是一个整数,而在于
+
是一个函数,因此不是“静态构造的”。有关递归值限制的完整说明,请参阅手册的第页。@LeoWhite您是对的-我的错。现在应该解决了。好吧,实际上我的例子并不是相互定义的。所以,如果我理解了你的意思,我的第一个例子不起作用,因为整数不能用
let rec。。。还有…
表达式,因为它们不是变量。问题并不在于
x
是一个整数,而在于
+
是一个函数,因此不是“静态构造的”。有关递归值限制的完整说明,请参阅手册的第页。@LeoWhite您是对的-我的错。现在应该修好了,好的