1

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

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. 

您能否在具体的基础上以清晰的推理展示您的深刻见解?

4

1 回答 1

5

您的代码中有两个函数。第一个是fun x -> x。这个函数不是递归的(它只是x原封不动地返回而不调用包括它自己在内的任何其他函数)并且它被命名为idusing let

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

id此代码中未重用该名称。它只用于指代函数fun x -> x。唯一被重用的名称是x:在id它的定义中用于引用id的参数,而在另一个函数的定义中,它用于引用该函数的参数。

于 2013-06-23T14:26:36.107 回答