将括号放在OCaml中的一般规则是什么?

时间:2014-02-09 22:14:33

标签: ocaml

我总是在OCaml中放置括号时遇到麻烦。好吧,我一直不想,但有时会得到错误。


例如,假设我有两个功能:

let f_a x y = x+ylet f_b x = x+1

如果我f_a 3 f_b 4,我就不能,我应该f_a 3 (f_b 4)

但如果我做f_a 3 * f_b 4,那就完全没问了。


另一个例子,如果我做f_a x y::[],它也没关系,我不需要像(f_a x y)::[]一样添加括号。

此外,我发现元组内的元素我不需要括号:(f_a 1 2, f_b 3)很好。


那么,任何人都可以教我一般规则来决定何时使用括号,何时不使用?

2 个答案:

答案 0 :(得分:3)

Here's一个表格,解释了OCaml中某些表达式的优先级和相关性。

从那里可以看出,函数应用程序是左关联的,这意味着f_a 3 f_b 4被解释为(((f_a) 3) f_b) 4。但是,乘法(*)的优先级低于函数应用程序,这意味着f_a 3 * f_b 4被解释为(f_a 3) * (f_b 4)(首先应用函数,然后乘法)。

最后,::的优先级低于函数应用程序,因此f_a x y::[]首先应用该函数,然后连接到空列表(即“消耗”::[])。这意味着f_a x y::[]被视为(f_a x y)::[]

不幸的是,我无法推断出一个简单的经验法则,但我始终记得“函数应用程序具有相当高的优先级并且是左关联的”。这对我很有用。

答案 1 :(得分:2)

括号只是对事物进行分组,因此它们被评估为一个而没有括号,它们可能或可能不是由于运算符优先级。函数应用程序的优先级高于所有普通运算符。您可以通过转here然后向上滚动一点来查看OCaml优先级表。