Risposte:
Ci sono molte differenze, alcune tecniche, altre sociopolitiche. Ho provato a mettere prima le differenze più importanti.
SML è una lingua con una definizione e uno standard. È stabile (e infatti è stato congelato, quindi non può evolversi). Objective Caml è un'implementazione controllata da un piccolo gruppo dell'INRIA. Continua ad evolversi. (IMO l'evoluzione è gestita bene.)
SML ha molte implementazioni; Caml ne ha solo uno.
Objective Caml ha una serie di caratteristiche aggiuntive, tra le quali le più importanti sono probabilmente gli oggetti e le varianti polimorfiche.
Le due lingue hanno modelli di tipi di record notevolmente diversi. In breve, in Caml, i nomi dei campi record devono essere univoci, dove in SML, due diversi tipi di record nello stesso ambito possono avere nomi di campo in comune. Questa stranezza può rendere un po 'complicato il porting da SML a Caml.
Ci sono alcune differenze sintattiche.
Le librerie e le funzioni standard sono notevolmente diverse. La libreria Caml è molto imperativa, mentre la libreria SML Standard Basis è più funzionale. Ad esempio, la composizione della funzione è una primitiva di primo livello in SML; non fa parte della libreria Caml. La libreria di stringhe Caml non fornisce una funzione di piegatura (almeno non a partire dalla versione 3.08). Le implementazioni di molte delle List
funzioni Caml non sono sicure per elenchi molto lunghi; fanno saltare la pila.
I sistemi di tipi sono leggermente diversi: in Caml, un'annotazione di tipo su un'espressione e : ty
è accettata se il tipo si ty
unifica con il tipo di e
. In SML, e : ty
è accettato solo se il tipo ty
è un'istanza del tipo di e
. Questa distinzione rende l'annotazione in Caml molto meno utile nella pratica, perché è impossibile usare un'annotazione di tipo per insistere sul fatto che un'espressione è polimorfica.
Caml ha una relazione molto più sensata e sensata tra le interfacce (chiamate tipi di modulo o firme ) e le implementazioni (concrete) (chiamate moduli o strutture ) rispetto a SML. In SML praticamente tutto va bene e devi fare affidamento sul programmatore per stabilire buone convenzioni. In Caml, le buone convenzioni vengono stabilite e applicate dal compilatore.
In SML, gli operatori aritmetici vengono sovraccaricati per essere applicati sia ai dati in virgola mobile che a quelli interi. In Caml, gli operatori non sono sovraccaricati; gli operatori in virgola mobile sono contrassegnati da un punto in più.
In SML, il programmatore può controllare la precedenza e l'associazione degli operatori infisso. In Caml, questi sono determinati dal primo carattere del nome dell'operatore. Questa restrizione limita i vantaggi di poter definire la propria notazione infissa.
Per un'analisi più dettagliata completa di commento editoriale, potresti anche guardare la pagina di confronto di Adam Chlipala .
e : 'a . ty(a)
è possibile e significativa.
Per i dettagli sulle differenze sintattiche menzionate da Norman Ramsey, ecco un paio di pagine web:
OCaml aggiunge funzionalità di orientamento agli oggetti e presenta alcune piccole differenze di sintassi.