Jac*_*ale 1 ocaml functional-programming
我知道这let rec
是我想要的时候使用的recursive
.
例如,
let rec power i x = if i = 0 then 1.0 else x *. (power (i-1) x);;
好的,我明白了.
但是这个怎么样:
let x y = y + y in x 2
?
我应该rec
在里面使用吗?
我想我应该,因为它有x 2
内部,加载自己,但似乎它与编译器一样好.
所以,当我应该使用let rec
,不应该?
另外,有什么区别
let (-) x y = y - x in 1-2-3;;
和
let rec (-) x y = y - x in 1-2-3;;
他们都合法吗?
您需要首先了解OCaml的范围规则.
当你写作let f XXX = YYY in ZZZ
,如果你使用f
,YYY
那么你需要rec
.在这两种情况下(即有或没有rec
),f
将在中定义ZZZ
.
所以:
let x y = y + y in
x 2
Run Code Online (Sandbox Code Playgroud)
完全有效.
对于你的第二个问题:不,它不是等价的,如果你在顶层上尝试它,第二个语句循环永远等同于let rec loop x y = loop y x in ()
.要理解为什么它永远是循环的,你可以理解loop
作为扩展的应用,其中标识符被其主体替换.所以:
所以loop
body是function x y -> loop y x
,可以扩展为
function x y -> (function a b -> loop b a) y x
(我已经重命名参数名称以避免歧义),这相当于function x y -> loop x y
当你应用body等等时.所以这个函数永远不会做任何事情,它只是通过尝试扩展/应用它的主体并交换它的参数来永远循环.