2012-12-12 6 views
8

Ich las heute Jason Hickey's Online-Buch "Einführung in Objective Caml" und im Kapitel über Funktoren (Seite 140) lief ich in der folgenden Zeile innerhalb der Set Funktoren Definition:In OCaml, warum ist der Listenkonstruktor :: kein Operator

let add = (::) 

Das Ausführen des Codes führte zu einer nicht sehr aufschlussreichen 'Syntaxfehler'-Fehlermeldung. Nach dem Plugin in der Zeile in ocaml Toplevel habe ich herausgefunden, dass :: eigentlich kein Operator, sondern ein Typkonstruktor ist.

Allerdings, von dem, was ich weiß, von Haskell der Äquivalent : Konstruktor kann auch als Operator (Funktion) behandelt werden.

Prelude> :t (:) 
(:) :: a -> [a] -> [a] 

Meine Frage ist: hat OCaml Bauer nie erste Klasse Werte gewesen (was bedeutet, dass der Code aus dem Buch von Anfang an falsch war), und warum ist dies der Fall?

+0

Normalerweise verwende ich '(Spaß x y -> x :: y)', um dieses Problem zu lösen (wandelt den Operator in ein Lambda um). Es ist ein bisschen nervig, aber funktioniert. Auch wenn '::' eine Funktion wäre, müssten Sie immer noch dasselbe tun, wenn Sie die Argumente für '' '' swapped brauchen, also denke ich, dass es in dieser Hinsicht einen Sinn ergibt. –

Antwort

10

In Caml Light, OCamls Vorgänger, war es früher so, dass Konstruktoren zu Funktionen wurden, wenn sie teilweise angewendet wurden. Ich bin mir nicht ganz sicher, warum diese Funktion entfernt wurde, als ich zu OCaml wechselte, und ich beklage das auch, aber die Erklärung, die ich hörte, war "niemand hat das benutzt". Also keine List.map Some foo mehr ...

:: ist etwas Besonderes, wie eine algebraische Datentyp Konstruktor, da es der einzige Infix Konstruktor (fest einprogrammiert im Parser), aber ansonsten verhält sich wie jeder andere Datentyp Konstruktor.

+0

Ich kann mich nicht daran erinnern, dass "niemand diese Erklärung verwendet hat". Ich denke, die Motivation war, den Unterschied zwischen Funktionen und Konstruktoren zu betonen ... – lukstafi

+1

Das ist interessant zu hören. Ich lese gleichzeitig den "Funktionalen Ansatz zum Programmieren" mit Caml Light und habe an mehreren Stellen die Sprache gefunden, die schöner ist als OCaml (Standard-Mustervergleich für Spaßdefinition, Let-In-Where-Form und eingebauter Funktionszusammensetzungsoperator). – PetarMarendic

+3

Xavier antwortete vor mehr als 10 Jahren: http://caml.inria.fr/pub/ml-archives/caml-list/2001/08/47db53a4b42529708647c9e81183598b.fr.html – camlspotter