Functional programming 我们什么时候使用let rec?

Functional programming 我们什么时候使用let rec?,functional-programming,ocaml,Functional Programming,Ocaml,我知道当我想要递归时,会使用let rec 比如说, 让rec power i x=如果i=0,则1.0否则x*。(功率(i-1)x) 好的,我理解 但是这个怎么样: 设x2中的xy=y+y 我应该在内部使用rec吗? 我想我应该这样做,因为它有x2内部,可以自己加载,但它似乎可以使用编译器 那么什么时候我应该使用let rec而不应该使用? 还有,两者的区别是什么 1-2-3中设(-)xy=y-x 及 让rec(-)xy=y-x在1-2-3中 它们都合法吗?您需要首先了解OCaml的范围规

我知道当我想要
递归
时,会使用
let rec

比如说,

让rec power i x=如果i=0,则1.0否则x*。(功率(i-1)x)

好的,我理解


但是这个怎么样:

设x2中的xy=y+y

我应该在内部使用
rec
吗?

我想我应该这样做,因为它有
x2
内部,可以自己加载,但它似乎可以使用编译器

那么什么时候我应该使用
let rec
而不应该使用?


还有,两者的区别是什么

1-2-3中设(-)xy=y-x

让rec(-)xy=y-x在1-2-3中


它们都合法吗?

您需要首先了解OCaml的范围规则

当您在ZZZ中写入
时,如果在
YYY
中使用
f
,则需要
rec
。在这两种情况下(即有或没有
rec
),将在
ZZZ
中定义
f

因此:

这是完全正确的

对于您的第二个问题:不,它不是等价的,如果您在顶层尝试它,第二个语句将永远循环,并且等价于
let rec loop x y=loop y x in()
。要理解它为什么会永远循环,您可以将
loop
的应用理解为一个扩展,其中标识符由其主体替换。因此:

所以
loop
主体是
function xy->loop yx
,可以扩展为
function x y->(function a b->loop b a)y x
(我重命名了参数名称以避免歧义),这相当于应用主体时的
function x y->loop x y
,依此类推。因此,这个函数永远不会做任何事情,它只是通过尝试扩展/应用其主体并交换其参数来永远循环。

您需要首先了解OCaml的作用域规则

当您在ZZZ中写入
时,如果在
YYY
中使用
f
,则需要
rec
。在这两种情况下(即有或没有
rec
),将在
ZZZ
中定义
f

因此:

这是完全正确的

对于您的第二个问题:不,它不是等价的,如果您在顶层尝试它,第二个语句将永远循环,并且等价于
let rec loop x y=loop y x in()
。要理解它为什么会永远循环,您可以将
loop
的应用理解为一个扩展,其中标识符由其主体替换。因此:

所以
loop
主体是
function xy->loop yx
,可以扩展为
function x y->(function a b->loop b a)y x
(我重命名了参数名称以避免歧义),这相当于应用主体时的
function x y->loop x y
,依此类推。所以这个函数从来没有做过任何事情,它只是通过尝试扩展/应用它的主体并交换它的参数来永远循环。

你能解释一下为什么让rec(-)xy=y-x在1-2-3
将永远循环?@JacksonTale:您正在定义函数
-
,然后在函数体
x-y
中使用它。所以,
x-y
被一次又一次地扩展成
x-y
。@AsiriRathnayake你的意思是我重新定义(-),然后y-x会变成x-y,然后y-x,然后x-y…。不停吗?@JacksonTale:是的,对不起,我没有注意到参数被交换了。你是对的。我已经添加了一些关于“永远循环”的注释。你能解释一下为什么在1-2-3中让rec(-)xy=y-x
将永远循环?@JacksonTale:您正在定义函数
-
,然后在函数体
x-y
中使用它。所以,
x-y
被一次又一次地扩展成
x-y
。@AsiriRathnayake你的意思是我重新定义(-),然后y-x会变成x-y,然后y-x,然后x-y…。不停吗?@JacksonTale:是的,对不起,我没有注意到参数被交换了。你说得对。我已经添加了一些关于“永远循环”的注释。
let x y = y + y in
x 2