我们什么时候使用let rec?

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;;

他们都合法吗?

Tho*_*mas 7

您需要首先了解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作为扩展的应用,其中标识符被其主体替换.所以:

所以loopbody是function x y -> loop y x,可以扩展为 function x y -> (function a b -> loop b a) y x(我已经重命名参数名称以避免歧义),这相当于function x y -> loop x y当你应用body等等时.所以这个函数永远不会做任何事情,它只是通过尝试扩展/应用它的主体并交换它的参数来永远循环.