为什么这些加法语句在 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
(为了防止吹毛求疵:为了上面的类型检查,sin
和 cos
不是来自 Pervasives
的 float
。)
函数应用的优先级高于+,所以你第一种写法相当于:
((lst_act x t curr) + 1)
我能找到的所有 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
(为了防止吹毛求疵:为了上面的类型检查,sin
和 cos
不是来自 Pervasives
的 float
。)
函数应用的优先级高于+,所以你第一种写法相当于:
((lst_act x t curr) + 1)