gpt4 book ai didi

ocaml - 让 rec 获取值,让 rec 获取 ocaml 中的函数

转载 作者:行者123 更新时间:2023-12-04 18:55:58 27 4
gpt4 key购买 nike

为什么第一个定义会被拒绝,而第二个定义会被接受,最好的直觉是什么?

let rec a = b (* This kind of expression is not allowed as right-hand side of `let rec' *)
and b x = a x

let rec a x = b x (* oki doki *)
and b x = a x

它是否与 2 种缩减方法有关:每个函数替换(和 Rec 分隔符)一个规则 VS 每个函数定义一个规则(和 lambda 提升)?

最佳答案

验证递归定义是否有效是一件非常困难的事情。

基本上,您要避免这种形式的模式:

let rec x = x

在定义的每个左侧都是函数声明的情况下,你知道它会没事的。在最坏的情况下,您正在创建一个无限循环,但至少您正在创造一个值(value)。但是 x = x case 不产生任何东西,并且完全没有语义。

现在,在您的特定情况下,您确实在创建函数(无限循环),但检查您实际上是更难。为了避免编写会尝试详尽检查的代码,OCaml 开发人员决定使用更简单的算法。

规则一览 here .这是摘录(重点是我的):

It will be accepted if each one of expr1exprn is statically constructive with respect to name1namen, is not immediately linked to any of name1namen, and is not an array constructor whose arguments have abstract type.



如您所见,不允许直接递归变量绑定(bind)。

但这不是最终规则,因为编译器的那部分有改进 pending release .我尚未测试您的示例是否通过它,但有一天您的代码可能会被接受。

关于ocaml - 让 rec 获取值,让 rec 获取 ocaml 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53336382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com