OCaml:为什么我不能使用这个运算符中缀?

时间:2011-05-27 09:51:28

标签: operators ocaml

我定义了一个自定义相等运算符(定义并不重要,所以我会插入虚拟东西):

let ( ~=~ ) a b = true

如果我尝试使用它中缀:

if a ~=~ b then 1 else 2

我收到以下错误:This expression is not a function; it cannot be applied

我可以通过将操作符从~=~重命名为=~或将其作为函数调用来解决此问题:if (~=~) a b then 1 else 2

这似乎是以~开头的运算符的一般问题。 我的问题是为什么我不能使用这样的运算符中缀? ~符号有什么特别之处吗?

注意:我已经完成了文档但我找不到任何相关内容。也许我错过了什么?

2 个答案:

答案 0 :(得分:49)

在OCaml中,运算符是中缀还是前缀由其第一个字符决定。 在你的情况下,字符'〜'用于前缀:通过let(〜=〜)a b = ...,你定义了一个前缀运算符。 〜= ~a是一个有效的表达式,并返回一个函数。

除了中缀或前缀,中缀运算符关联性(左或右)和运算符优先级(其中+和*具有更强?)在语法上由运算符的第一个字符确定。

这听起来很丑陋,因为你无法控制你的花哨操作符特性,但是有很多奇怪的自定义操作符的其他人更容易阅读OCaml源代码。

以下是运营商的字符表:

The first char   :  prefix/infix/connectivity power/left-or-right
! ~ ?            :  prefix
= < > | & $      :  infix0, left
@ ^              :  infix1, right
+ -              :  infix2, left
* /              :  infix3, left  ( ** is exceptional. It is right assoc and have power 4)

答案 1 :(得分:7)

通过ocaml ~的词汇约定保留给前缀运算符,请参阅 http://caml.inria.fr/pub/docs/manual-ocaml/lex.html#infix-symbol