【问题标题】:Mutually recursive definition in OCamlOCaml 中的相互递归定义
【发布时间】:2014-07-16 06:57:04
【问题描述】:

我知道 OCaml 提供了let rec ... and ... 用于定义相互递归函数。为什么我不能使用该表达式来定义相互递归的值?

特别是,为什么我不能做类似let rec x=3 and y=x+5 in x 的事情,但我可以做let rec x=3 and y=[x;4] in y

对于第一种情况,我试图给我一个答案,我认为这是一个绑定“问题”,因为值的绑定应该是同时的,所以 y 不知道 x 的值所以我不能把它加到常数 5 的值上。 是真的吗?

【问题讨论】:

    标签: binding ocaml


    【解决方案1】:

    您的定义都不是相互递归的。你也可以这样写:

    let x = 3 in
    let y = x + 5 in
    x
    

    let x = 3 in
    let y = [x; 4] in
    y
    

    相互递归的定义如下所示:

    let rec x = y + 3
    and y = x + 5 in
    x
    

    let rec x = 3 :: y
    and y = 4:: x in
    x
    

    在第二段代码中,x 是一个循环列表,其中包含一个 3,后跟一个 4,然后循环回到开头。然而,第一段代码没有任何意义。当y 等于x + 5 时,x 怎么能等于y + 3?它不能,因此只能使用变体类型的构造函数来定义递归值(因为这是递归值不会导致无限递归的唯一情况)。

    因此,由于没有构造函数就无法定义递归值,并且当您尝试定义的值不是递归时,let rec ... and 语法不是必需的,因此该语法根本不能用于构造函数应用程序之外的任何东西。

    【讨论】:

    • 好的,实际上我的示例并没有真正相互定义。所以,如果我理解你的意思,我的第一个例子不起作用,因为整数不能用let rec... and ... 表达式定义,因为它们不是变体。
    • 事实上,x 是一个整数并不是问题所在,而是+ 是一个函数,因此不是“静态构造的”。有关递归值限制的完整说明,请参阅手册的Section 7.3
    • @LeoWhite 你是对的——我的错。现在应该修好了。
    猜你喜欢
    • 2013-06-01
    • 2015-06-10
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多