我习惯使用( + )
来引用普遍的整数加法运算符,但这对( :: )
不起作用:
OCaml version 4.01.0 # (+);; - : int -> int -> int = <fun> # ( :: );; Error: Syntax error: operator expected. # ( := );; - : 'a ref -> 'a -> unit = <fun>
expr ::= ... | expr :: expr ... ∣ [ expr { ; expr } [;] ] ... | expr infix-op expr ...
infix-symbol ::= (= ∣ < ∣ > ∣ @ ∣ ^ ∣ | ∣ & ∣ + ∣ - ∣ * ∣ / ∣ $ ∣ %) { operator-char }
似乎将::
和:=
排除为中缀运算符,即使( := )
工作得很好。
::
作为运营商的状态是什么?
列表前置运算符是否有方便的句柄,或者(fun el ls -> el::ls)
是最好的处理器吗?
答案 0 :(得分:2)
::
是一个无法用其他结构实现的基础结构。 :=
是一个可以实现为let (:=) r v = r.contents <- v
的运算符。但我同意这与手册中描述的词汇约定相矛盾。
对于使用(::)
的问题,如果要多次使用它,最好的办法是给它一个简短的名称。 let cons h t = h :: t
答案 1 :(得分:2)
cons运算符::
是构造函数,不能作为中缀运算符应用。
Have a look at the pervasive module列出了您可以使用的所有内容。
答案 2 :(得分:2)
你在那里跳了一下。你引用似乎排除了::和:=作为中缀运算符,尽管如此 (:=)效果很好。
expr ::= ...
| expr infix-op expr
但是你没有看infix-op
,它被定义为
infix-op ::= infix-symbol
∣ * ∣ + ∣ - ∣ -. ∣ = ∣ != ∣ < ∣ > ∣ or ∣ || ∣ & ∣ && ∣ :=
∣ mod ∣ land ∣ lor ∣ lxor ∣ lsl ∣ lsr ∣ asr
所以,:=
是一个中缀运算符,以及其他类似mod
等等。infix-symbol
仅适用于自定义中缀运算符。