似乎有许多符号可以充当中缀运算符;例如
(+)
,(-)
,(*)
,(/)
,mod
(+.)
,(-.)
,(*.)
,(/.)
(=)
,(<>)
,(<)
,(<=)
,(>)
,(>=)
(|>)
,(<<)
,(>>)
(>>=)
,(>>|)
(::)
,(@)
(^)
,(^/)
,(^:)
什么决定一个函数是否可以充当中缀运算符?
答案 0 :(得分:3)
由运算符的第一个符号确定。来自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描述了:
mod
,land
,lor
,lxor
,lsl
,lsr
和asr
是关键字作为中缀运算符(例如2 mod 4
)。
-
和-.
可以解释为中缀或前缀运算符。当前缀thay分别转换为~-
和~-.
时。
&&
和||
也被特别对待。有关更多说明,请参见下面@octachron的评论。
最后,您可能还需要考虑优先级和关联性,这在顶部before the first section here
附近的表中列出