似乎有许多符号可以充当中缀运算符;例如
- 整数:
(+),(-),(*),(/),mod - 浮动:
(+.),(-.),(*.),(/.) - 比较:
(=),(<>),(<),(<=),(>),(>=) - 函数:
(|>),(<<),(>>) - 单子:
(>>=),(>>|) - 列表:
(::),(@) - 杂项:
(^),,,(^/)(^:)
是什么决定了函数是否可以充当中缀运算符?
似乎有许多符号可以充当中缀运算符;例如
(+), (-), (*), (/),mod(+.), (-.), (*.),(/.)(=), (<>), (<), (<=), (>),(>=)(|>), (<<),(>>)(>>=),(>>|)(::),(@)(^),,,(^/)(^:)是什么决定了函数是否可以充当中缀运算符?
它由运算符的第一个符号确定。从手册:
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,lsr和asr是被视为中缀运算符的关键字(例如2 mod 4)。
-并且-.可以解释为中缀或前缀运算符。当前缀 thay 分别被翻译为~-和时~-.。
&&并且||出于某种原因也受到特殊对待。请参阅下面@octachron 的评论以获得更多解释。
最后,您可能还想在此处的第一部分之前考虑优先级和关联性,它们列在顶部附近的表格中