2013-10-30 102 views
1

我已經習慣了使用(+)引用普遍的整數加法運算符,但這並不爲(::)工作:引用運營商::

 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 } 

這似乎排除雙方:::=中綴操作符,即使(:=)作品就好了。


什麼是::的作爲一個經營者的地位?

是否有一個方便的處理列表prepend運算符或是(fun el ls -> el::ls)最好的人可以做的?

回答

2

::是一個基礎建設,不能與其他結構實施。 :=是一個可以實現爲​​的運營商。但我同意這與手冊中描述的詞彙約定相矛盾。

對於您使用(::)的問題,您可以做的最好的方法是給它一個簡短的名稱,如果您想多次使用它。 let cons h t = h :: t

+0

它不與詞法語法矛盾。 – newacct

2

缺點運算符::是一個構造函數,它不能作爲中綴運算符應用。

Have a look at the pervasive module查看所有可用的列表。

+0

感謝您解釋'::'是一個構造函數。這就說得通了。我確實看了一下'pervasives'模塊,但是因爲它瘋狂地不完整而感到困惑;例如,它沒有定義'type'list' :) –

2

雖然 (:=)可以正常工作,但似乎排除::和:=作爲中綴運算符。

你在那裏跳了一跳。你舉

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

但你沒看infix-op,它被定義爲

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

所以有,:=是一箇中綴操作符,與其他的像mod沿等infix-symbol只爲定製中綴運營商。

+0

是的,我必須掩飾「op」和「symbol」之間的區別。感謝您指出了這一點。 –