我可以为OCAML找到的所有文档都同意“+”运算符仅用于整数加法。我有一个函数需要在每次递归调用时递增一个整数。功能定义:
let rec lst_act x lst c = ...
该函数中的原始递归调用:
(lst_act x t curr+1)
这个功能没有按预期工作,我真的不知道为什么。我决定将递归调用更改为:
(list_act x t (curr + 1))
瞧,它有效。如果+运算符仅用于ocaml中的整数加法,我不明白这些语句是如何不同的。
有人可以解释一下这个差异,以及“+”运算符的每个用途是什么吗?谢谢!
答案 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
(为了防止挑剔:为了进行上述检查,sin
和cos
不是来自Pervasives
float
的{{1}}。