试图更多地了解OCaml中的运算符关联性

时间:2014-03-10 13:34:34

标签: ocaml

我对OCaml中的关联性感到非常困惑。

首先让我们举一些例子。

1。 +是关联的还是正确的?

我认为它是联想的。这意味着如果我们有a + b + c + d,则为((a+b)+c)+d

但是如果我们f1 1 + f2 2怎么办?它会抛出错误吗?因为它应该是((f1 1)+f2) 2,对吧?

2。 ::是正确关联的,但如果与,一起使用会怎样?

如果我们4,3::[],那么我们有[4,3]。它会创建一个元组(4,3),然后将::创建为[]

那么为什么4,3::5,6::[]不起作用?

第3。功能

假设我们有let f x y = y x 5,因此y是一个带有两个参数的函数。

如果我们执行f 1 + 2,因为+实际上是一个带有两个参数的函数,为什么f 1 + 2不起作用?为什么+不会成为f的参数?

4。正确的关联性

如何创建具有正确关联性的中缀函数?


基本上,我想我还没有理解OCaml中的整个关联/优先级。

我知道那里有像http://caml.inria.fr/pub/docs/manual-caml-light/node4.9.html这样的表格。但有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:5)

当有多个具有相同优先级的运算符时,运算符关联性确定如何解析表达式。例如,a + b + c有两个具有相同优先级(++)的运算符,因此关联性决定了如何解析该表达式:运算符是左关联的,因此表达式是相当于(a + b) + c

在表达式f1 1 + f2 2中,并置(f1 1f2 2)的优先级高于+,因此表达式等同于(f1 1) + (f2 2)。在同一优先级别上没有两个或更多运算符,因此关联性无关紧要。

您关于4,3::[]的陈述是错误的:::的优先级高于,,因此它被解析为4, (3::[]),而不是(4,3)::[]。结果是一对,其第二个元素是列表。阅读4,3::5,6::[]的类型错误:它等同于(4, (3::5), (6::[])),因此编译器会抱怨5的类型为int,但上下文(由于:: operator)需要一个列表。

当您编写f 1 + 2时,它会被解析为(f 1) + 2。函数f应用于整数参数;由于f需要两个参数,结果是一个函数(等待第二个参数),但+运算符需要一个整数,因此表达式是错误的。 +不是f的参数,因为+本身不是表达式,函数的参数是表达式。

我不知道你的意思是“具有正确联想的中缀功能”。 Ocaml中运算符的关联性和优先级由运算符的第一个字符决定,如链接表中所示。

这些都是解析中的标准概念,适用于几乎所有编程语言。我建议阅读任何有关编程语言语法或解析的章节的教科书,或者从associativityprecedence上的维基百科文章开始。