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

Why do these addition statements produce different results in ocaml?

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

let rec lst_act x lst c = ...

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

(lst_act x t curr+1)

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

(list_act x t (curr + 1))

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

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

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

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 不是来自 Pervasivesfloat。)

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

((lst_act x t curr) + 1)