我知道当我需要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;;
他们都合法吗?
答案 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}},依此类推。所以这个函数永远不会做任何事情,它只是通过尝试扩展/应用它的主体并交换它的参数来永远循环。