1

我习惯于( + )引用普遍的整数加法运算符,但这不适用于( :: )

        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)最好的句柄?

4

3 回答 3

2

::是其他结构无法实现的基础结构。:=是一个可以实现为 的运算符let (:=) r v = r.contents <- v。但我同意这与手册中描述的词汇约定相矛盾。

对于您的使用问题,(::)如果您想多次使用它,您可以做的最好的就是给它一个短名称。let cons h t = h :: t

于 2013-10-30T18:50:07.643 回答
2

cons 运算符::是构造函数,不能用作中缀运算符。

查看 pervasive 模块,了解您可以使用的所有模块的列表。

于 2013-10-30T18:51:52.497 回答
2

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

你在那里做了一个跳跃。你引用

expr  ::= ...
        | expr  infix-op  expr

但是后来你没有看infix-op,它被定义为

infix-op    ::= infix-symbol  
         ∣   * ∣  + ∣  - ∣  -. ∣  = ∣  != ∣  < ∣  > ∣  or ∣  || ∣  & ∣  && ∣  :=  
         ∣   mod ∣  land ∣  lor ∣  lxor ∣  lsl ∣  lsr ∣  asr

因此,:=有一个中缀运算符,以及其他诸如mod等的运算符,infix-symbol仅适用于自定义中缀运算符。

于 2013-10-30T20:55:28.897 回答