2013-10-20 18 views
10

Gibt es in OCaml eine Möglichkeit, sich selbst auf den Cons-Operator zu beziehen?OCaml Nachteile (: :) Operator?

Zum Beispiel kann ich (+) und (*) als int -> int -> int Funktionen verwenden, aber ich kann nicht (::) als 'a -> 'a list -> 'a list Funktion, wie das folgende Beispiel zeigen verwenden:

# (+) 3 5;; 
- : int = 8 
# (*) 4 6;; 
- : int = 24 
# (::) 1 [2;3;4];; 
Error: Syntax error: operator expected. 

Gibt es eine Möglichkeit, ein Ergebnis wie (::) zu produzieren anders als mit fun x y -> x::y? Und weiß jemand, warum (::) nicht in OCaml implementiert wurde?

+0

Es würde funktionieren, wenn Sie die Argumente mit Klammern umgeben, so: '(: :) (1, [2; 3; 4]) ;;' –

Antwort

9

Nein. Nachteile (: :) ist ein Konstruktor, Konstruktoren können keine Infix-Operatoren sein. Die erlaubten Infix Symbole sind hier:

http://caml.inria.fr/pub/docs/manual-caml-light/node4.9.html

Einige Abhilfen sind die ausführlichen (wie Sie erwähnen)

(fun x l -> x :: l) 

und definieren Sie Ihre eigenen nicht-traditionellen Infix Nachteile

let (+:) x l = x :: l 
+0

Als Referenz wird das Wissen eingeführt von [http: // caml.inria.fr/pub/docs/manual-ocaml-4.00/expr.html#toc50] Abschnitt Varianten. – Gqqnbig

13

auf das Hinzufügen Antwort von @seanmcl,

Eigentlich OCaml unterstützt ein Präfix Form (: :):

# (::)(1, []);; 
- : int list = [1] 

Dies ist in der uncurried Form, mit der Tatsache entspricht, dass alle OCaml Variante Konstruktoren werden nicht curried und nicht teilweise angewendet werden kann. Dies wird durch eine spezielle Parsing-Regel nur für (: :) behandelt, weshalb Sie eine ziemlich merkwürdige Fehlermeldung erhalten haben: Error: Syntax error: operator expected..

Update:

nächste OCaml 4.02 beseitigt diese Parsing Regel also das ist nicht mehr verfügbar.