Antworten:
Es gibt viele Unterschiede, einige technische, andere gesellschaftspolitische. Ich habe versucht, wichtigere Unterschiede an die erste Stelle zu setzen.
SML ist eine Sprache mit einer Definition und einem Standard. Es ist stabil (und wurde tatsächlich eingefroren, damit es sich nicht entwickeln kann). Objective Caml ist eine Implementierung, die von einer kleinen Gruppe bei INRIA kontrolliert wird. Es entwickelt sich weiter. (IMO wird die Evolution gut gemanagt.)
SML hat viele Implementierungen; Caml hat nur einen.
Objective Caml verfügt über eine Reihe zusätzlicher Funktionen, von denen wahrscheinlich Objekte und polymorphe Varianten die bekanntesten sind.
Die beiden Sprachen haben dramatisch unterschiedliche Modelle von Datensatztypen. Kurz gesagt, in Caml müssen die Namen von Datensatzfeldern eindeutig sein, während in SML zwei verschiedene Datensatztypen im selben Bereich möglicherweise gemeinsame Feldnamen haben. Diese Eigenart kann das Portieren von SML nach Caml etwas schwierig machen.
Es gibt einige syntaktische Unterschiede.
Die Bibliotheken und Standardfunktionen unterscheiden sich dramatisch. Die Caml-Bibliothek ist sehr wichtig, während die SML Standard Basis Library funktionaler ist. Beispielsweise ist die Funktionszusammensetzung ein Grundelement der obersten Ebene in SML. Es ist nicht Teil der Caml-Bibliothek. Die Caml-String-Bibliothek bietet keine Fold-Funktion (zumindest nicht ab Version 3.08). Die Implementierung vieler Caml- List
Funktionen ist für sehr lange Listen nicht sicher. Sie sprengen den Stapel.
Die Typsysteme unterscheiden sich geringfügig: In Caml wird eine Typanmerkung für einen Ausdruck e : ty
akzeptiert, wenn der Typ mit dem Typ von ty
übereinstimmte
. e : ty
Wird in SML nur akzeptiert, wenn der Typ ty
eine Instanz des Typs von ist e
. Diese Unterscheidung macht die Annotation in Caml in der Praxis viel weniger nützlich, da es unmöglich ist, eine Typanmerkung zu verwenden, um darauf zu bestehen, dass ein Ausdruck polymorph ist.
Caml hat eine viel vernünftigere und vernünftigere Beziehung zwischen Schnittstellen (als Modultypen oder Signaturen bezeichnet ) und (konkreten) Implementierungen (als Module oder Strukturen bezeichnet ) als SML. In SML ist so ziemlich alles möglich und man muss sich auf den Programmierer verlassen, um gute Konventionen zu etablieren. In Caml werden vom Compiler gute Konventionen festgelegt und durchgesetzt.
In SML werden arithmetische Operatoren überladen, um sie sowohl auf Gleitkomma- als auch auf Ganzzahldaten anzuwenden. In Caml sind die Bediener nicht überlastet. Gleitkommaoperatoren werden mit einem zusätzlichen Punkt versehen.
In SML kann der Programmierer die Priorität und Zuordnung von Infix-Operatoren steuern. In Caml werden diese durch das erste Zeichen des Operatornamens bestimmt. Diese Einschränkung schränkt die Vorteile der Definition Ihrer eigenen Infix-Notation ein.
Eine detailliertere Analyse mit redaktionellen Kommentaren finden Sie auch auf der Vergleichsseite von Adam Chlipala .
e : 'a . ty(a)
möglich und sinnvoll sind.
Einzelheiten zu den von Norman Ramsey erwähnten syntaktischen Unterschieden finden Sie auf einigen Webseiten:
OCaml fügt Objektorientierungsfunktionen hinzu und weist einige geringfügige Syntaxunterschiede auf.