我定义了一个自定义相等运算符(定义并不重要,所以我会插入虚拟东西):
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
。
这似乎是以~
开头的运算符的一般问题。
我的问题是为什么我不能使用这样的运算符中缀? ~
符号有什么特别之处吗?
注意:我已经完成了文档但我找不到任何相关内容。也许我错过了什么?
答案 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