我们什么时候使用let rec?

时间:2012-12-04 10:25:35

标签: functional-programming ocaml

我知道当我需要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;;

他们都合法吗?

1 个答案:

答案 0 :(得分:7)

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

当您撰写let f XXX = YYY in ZZZ时,如果您在f中使用YYY,那么您需要rec。在这两种情况下(即有或没有rec),f将在ZZZ中定义。

所以:

let x y = y + y in
x 2

完全有效。

对于你的第二个问题:不,它不是等价的,如果你在顶层上尝试它,第二个语句循环永远,等同于let rec loop x y = loop y x in ()。要理解为什么它永远循环,你可以理解loop作为扩展的应用,其中标识符被其主体替换。这样:

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