我正在阅读一些示例并遇到此代码,谷歌让我失望。
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.
你能否凭借明确的理由站在具体的基础上,展示你富有洞察力的想法?
答案 0 :(得分:5)
您的代码中有两个功能。第一个是fun x -> x
。此函数不是递归的(它只返回x
而不调用任何其他函数,包括它自己),并使用id
给它命名为let
。
另一个功能是fun x -> if x > 0 then id [] else (id x) :: []
。此功能没有名称。它也不是递归的,因为它调用的唯一函数是id
而id
不会回调它。
此代码中未重用名称id
。它只用于引用函数fun x -> x
。正在重用的唯一名称是x
:在id
的定义中,它用于引用id
的参数,并在其他函数的定义中用于引用该函数的论点。