代码之家  ›  专栏  ›  技术社区  ›  nicolas

let rec表示ocaml中的值,let rec表示ocaml中的函数

  •  5
  • nicolas  · 技术社区  · 7 年前

    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
    

    它是否与两种简化方法相关联:每个函数替换一条规则(和一个Rec分隔符)与每个函数定义一条规则(和lambda提升)?

    1 回复  |  直到 7 年前
        1
  •  5
  •   PatJ    7 年前

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

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

    let rec x = x
    

    如果定义的每一个左侧都是函数声明,那么您就知道这是可以的。最坏的情况是,您正在创建一个无限循环,但至少您正在创建一个值。但是 x = x 大小写不产生任何东西,也没有任何语义。

    你可以对规则有一个展望 here . 以下是摘录(我的重点):

    如果每一个 expr1 exprn 是关于 name1 namen 未立即链接到任何 纳明 ,并且不是参数具有抽象类型的数组构造函数。

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

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

    推荐文章