【发布时间】:2013-06-23 14:01:54
【问题描述】:
我正在阅读一些示例并遇到此代码,谷歌让我失望了。
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.
您能否在具体的基础上以清晰的推理展示您的深刻见解?
【问题讨论】:
-
另外,
id函数是为它后面的范围定义的,正如这个问题的答案所正确解释的那样,它是一个匿名函数,因此这两个函数实际上都无法从这个后面的任何语句中访问... -
我在想整个东西都叫“id”
-
是的,这就是我从你的问题中得到的印象。对于习惯于其他语言习语的人来说,这种表示法可能会产生误导。
in关键字非常重要,甚至可以在顶层使用,不仅在函数内部(您的代码清楚地说明了该功能)。有必要使最终用户的语言“行为”一致,并且对于语言实现者来说也是可取的,因为它简化了语法。顺便说一句,好问题。 -
@didierc 好点!一致的语法和语法对于最终用户来说非常重要,尤其是对于那些刚开始使用的用户。
标签: ocaml