我总是在OCaml中放置括号时遇到麻烦。好吧,我一直不想,但有时会得到错误。
let f_a x y = x+y
和let 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)
很好。
那么,任何人都可以教我一般规则来决定何时使用括号,何时不使用?
答案 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优先级表。