【问题标题】:OCaml Complicated Name reuse v.s Recursive func. ConfusionOCaml 复杂名称重用与递归函数。困惑
【发布时间】: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


【解决方案1】:

您的代码中有两个函数。第一个是fun x -&gt; x。这个函数不是递归的(它只是返回 x 不变而不调用包括它自己在内的任何其他函数)并且它被命名为 id 使用 let

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2013-05-20
    • 2011-10-26
    相关资源
    最近更新 更多