1

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

  • 整数:(+), (-), (*), (/),mod
  • 浮动:(+.), (-.), (*.),(/.)
  • 比较:(=), (<>), (<), (<=), (>),(>=)
  • 函数:(|>), (<<),(>>)
  • 单子:(>>=),(>>|)
  • 列表:(::),(@)
  • 杂项:(^),,,(^/)(^:)

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

4

1 回答 1

3

它由运算符的第一个符号确定。从手册

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

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

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

因此,例如,像这样定义的自定义运算符:

let (@?) a b = ...

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

let (?@) a b = ...

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

但是,这里的手册中有一些补充和例外情况:

  • mod, land, lor, lxor, lsl,lsrasr是被视为中缀运算符的关键字(例如2 mod 4)。

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

  • &&并且||出于某种原因也受到特殊对待。请参阅下面@octachron 的评论以获得更多解释。

最后,您可能还想在此处的第一部分之前考虑优先级和关联性,它们列在顶部附近的表格中

于 2018-12-01T17:51:42.573 回答