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