我定义了一个自定义相等运算符(定义并不重要,所以我将插入虚拟东西):
let ( ~=~ ) a b = true
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用它中缀:
if a ~=~ b then 1 else 2
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:This expression is not a function; it cannot be applied.
我可以通过将操作符重命名~=~为=~或通过将其作为函数调用来解决此问题:if (~=~) a b then 1 else 2.
这似乎是运营商的一个普遍问题~.我的问题是为什么我不能使用这样的运算符中缀?~符号有什么特别之处吗?
注意:我已经通过了文档,但我找不到任何相关的内容.也许我错过了什么?
小智 51
在OCaml中,运算符是中缀还是前缀由其第一个字符决定.在你的情况下,字符'〜'用于前缀:通过let(〜=〜)ab = ...,你定义了一个前缀运算符.〜= ~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)
Run Code Online (Sandbox Code Playgroud)