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

Cal*_*lin 23 ocaml operators

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

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)

  • @Ricardo:http://caml.inria.fr/pub/docs/manual-ocaml/expr.html(靠近顶部)有一个运营商优先级表.请注意,它首先列出了更高优先级的运算符. (5认同)
  • 在官方文档的哪一部分提供此信息?我找不到关于右/左关联性的部分. (2认同)

ygr*_*rek 7

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