似乎有许多符号可以充当中缀运算符;例如
- 整数:
(+)
,(-)
,(*)
,(/)
,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 的评论以获得更多解释。
最后,您可能还想在此处的第一部分之前考虑优先级和关联性,它们列在顶部附近的表格中