引用运算符::

时间:2013-10-30 18:38:20

标签: operators ocaml

我习惯使用( + )来引用普遍的整数加法运算符,但这对( :: )不起作用:

        OCaml version 4.01.0

# (+);;
- : int -> int -> int = <fun>
# ( :: );;
Error: Syntax error: operator expected.
# ( := );;
- : 'a ref -> 'a -> unit = <fun>

The expression grammar

expr  ::= ...
        | expr  ::  expr
        ...
        ∣ [ expr  { ; expr }  [;] ]  
        ...
        | expr  infix-op  expr
        ...

lexical conventions

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

似乎将:::=排除为中缀运算符,即使( := )工作得很好。


::作为运营商的状态是什么?

列表前置运算符是否有方便的句柄,或者(fun el ls -> el::ls)是最好的处理器吗?

3 个答案:

答案 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仅适用于自定义中缀运算符。