【问题标题】:Why do these addition statements produce different results in ocaml?为什么这些加法语句在 ocaml 中会产生不同的结果?
【发布时间】:2018-02-18 09:19:53
【问题描述】:

我能找到的所有 OCAML 文档都同意“+”运算符仅用于整数加法。我有一个函数需要在每次递归调用时增加一个整数。函数定义:

let rec lst_act x lst c = ...

该函数中的原始递归调用:

(lst_act x t curr+1)

这个功能没有按预期工作,我真的不知道为什么。我决定将递归调用改为:

(list_act x t (curr + 1))

瞧,它奏效了。如果 + 运算符仅用于 ocaml 中的整数加法,我不明白这些语句有何不同。

谁能解释一下区别,以及“+”运算符的每种用途是什么?谢谢!

【问题讨论】:

    标签: integer operators ocaml addition


    【解决方案1】:

    函数应用的优先级高于+,所以你写的第一种方式相当于:

    ((lst_act x t curr) + 1)
    

    【讨论】:

      【解决方案2】:

      原因是函数应用比二元运算符具有更高的优先级(绑定更强)。所以你的表情

      lst_act x t curr+1
      

      被解析为

      (lst_act x t curr) + 1
      

      而不是像

      lst_act x t (curr+1)
      

      正如你所假设的那样。该代码的行为方式取决于程序的其余部分;我不能说太多。在任何情况下,它都是相同的加法运算符+,但适用于不同的东西。

      顺便说一句,优先级的选择与日常公式中的相同:

      sin(x) + cos(x)
      

      被解析为(sin(x)) + (cos(x)) 而不是(sin(x+cos))(x)sin((x+cos)(x)) 或其他任何东西。只是在OCaml中,括号在函数应用中是可选的,所以相当于

      sin x + cos x
      

      (为了防止挑剔:为了对上述内容进行类型检查,sincos 不是来自 Pervasives 的,它们在 float 上运行。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-04
        • 2023-04-11
        相关资源
        最近更新 更多