为什么这些加法语句在ocaml中产生不同的结果?

时间:2018-02-18 09:19:53

标签: integer operators ocaml addition

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

let rec lst_act x lst c = ...

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

(lst_act x t curr+1)

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

(list_act x t (curr + 1))

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

有人可以解释一下这个差异,以及“+”运算符的每个用途是什么吗?谢谢!

2 个答案:

答案 0 :(得分:6)

函数应用程序的优先级高于+,因此编写它的第一种方式相当于:

Strategy Pattern

答案 1 :(得分:3)

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

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的{​​{1}}。