中缀运算符的合法名称是什么?

What are the legal names for infix operators?

似乎有许多符号可以充当中缀运算符;例如

什么决定一个函数是否可以充当中缀运算符?

由运算符的第一个符号决定。来自 the manual:

infix-symbol    ::= (= ∣  < ∣  > ∣  @ ∣  ^ ∣  | ∣  & ∣  + ∣  - ∣  * ∣  / ∣  $ ∣  %) { operator-char }  
    ∣    # { operator-char }+  

prefix-symbol   ::= ! { operator-char }  
    ∣    (? ∣  ~) { operator-char }+  

operator-char   ::= ! ∣  $ ∣  % ∣  & ∣  * ∣  + ∣  - ∣  . ∣  / ∣  : ∣  < ∣  = ∣  > ∣  ? ∣  @ ∣  ^ ∣  | ∣  ~

因此,例如,定义如下的自定义运算符:

let (@?) a b = ...

将被视为中缀运算符,因为它以 @ 开头,而

let (?@) a b = ...

是前缀运算符,因为它以 ?.

开头

有一些补充和例外情况,但是,in the manual here:

  • modlandlorlxorlsllsrasr 是被视为中缀运算符的关键字(例如 2 mod 4)。

  • --. 可以解释为中缀或前缀运算符。当前缀thay分别被翻译成~-~-.时。

  • &&|| 也被特殊对待,这是有原因的。请参阅下面@octachron 的评论以获得更多解释。

最后,您可能还想考虑优先级和结合性,它们列在靠近顶部的 table 中,before the first section here