Quali sono le differenze tra SML e OCaml? [chiuso]


Risposte:


157

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 Listfunzioni 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 .


4
Hai dimenticato l'uguaglianza (illimitata e non sicura in OCaml rispetto a tipi di uguaglianza sicuri ma limitati in SML), variabili di tipo non generalizzate ('_a in OCaml), printf, interpretazione dei nomi di file come nomi di modulo in OCaml, molto più curry nello stdlib di OCaml. Hai scritto l'interfaccia due volte quando intendi qualcos'altro (implementazione?) La seconda volta.
JD

1
e gli or-patterns di OCaml e le guardie nel pattern matching.
JD

1
Si noti che la limitazione sull'utilità delle annotazioni di tipo è stata in qualche modo alleviata in 3.12, dove l'annotazione e : 'a . ty(a)è possibile e significativa.

4
Fai l'importante osservazione: "La libreria Caml è molto imperativa". Questo sembra permeare l'intera filosofia, al punto che l'implementazione parallela su hardware multicore sembra essere molto difficile o impossibile. Al contrario, ci sono almeno due SML paralleli: Mlton e Poly / ML.
Makarius

2
Circa il terzo punto, i nomi dei record non richiedono più l'unicità in OCaml.
PatJ


-3

OCaml aggiunge funzionalità di orientamento agli oggetti e presenta alcune piccole differenze di sintassi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.