OCaml复杂名称重用v.s递归函数。混乱

时间:2013-06-23 14:01:55

标签: ocaml

我正在阅读一些示例并遇到此代码,谷歌让我失望。

let id = fun x -> x in fun x -> if x> 0 then id [] else (id x) :: [];;
- : int -> int list = <fun>

正如Caml告诉我们的那样,这证明是一般的功能。

但它有“let”而不是“let rec”,而功能名称id在功能体中出现了好几次。

乍一看这看起来不合逻辑。

所以我在想

1. is this actually a recursive function? 

2. Or they just happen to be different types reusing the same name confusingly. 

你能否凭借明确的理由站在具体的基础上,展示你富有洞察力的想法?

1 个答案:

答案 0 :(得分:5)

您的代码中有两个功能。第一个是fun x -> x。此函数不是递归的(它只返回x而不调用任何其他函数,包括它自己),并使用id给它命名为let

另一个功能是fun x -> if x > 0 then id [] else (id x) :: []。此功能没有名称。它也不是递归的,因为它调用的唯一函数是idid不会回调它。

此代码中未重用名称id。它只用于引用函数fun x -> x。正在重用的唯一名称是x:在id的定义中,它用于引用id的参数,并在其他函数的定义中用于引用该函数的论点。