Jest wiele różnic, niektóre techniczne, niektóre społeczno-polityczne. Próbowałem najpierw umieścić ważniejsze różnice.
SML to język z definicją i standardem. Jest stabilny (i faktycznie został zamrożony, więc nie może ewoluować). Objective Caml to realizacja kontrolowana przez małą grupę w INRIA. Nadal ewoluuje. (IMO ewolucja jest dobrze zarządzana.)
SML ma wiele implementacji; Caml ma tylko jedną.
Obiektyw Caml posiada szereg dodatkowych cech, wśród których najwybitniejsze są prawdopodobnie obiekty i warianty polimorficzne.
Te dwa języki mają radykalnie różne modele typów rekordów. Krótko mówiąc, w Caml nazwy pól rekordów muszą być unikalne, podczas gdy w SML dwa różne typy rekordów w tym samym zakresie mogą mieć wspólne nazwy pól. To dziwactwo może sprawić, że przenoszenie z SML na Caml będzie trochę trudne.
Istnieje kilka różnic składniowych.
Biblioteki i standardowe funkcje są diametralnie różne. Biblioteka Caml jest bardzo potrzebna, podczas gdy biblioteka SML Standard Basis jest bardziej funkcjonalna. Na przykład kompozycja funkcji jest prymitywem najwyższego poziomu w SML; nie jest częścią biblioteki Caml. Biblioteka ciągów Caml nie zapewnia funkcji zwijania (przynajmniej nie w wersji 3.08). Implementacje wielu Listfunkcji Caml są niebezpieczne w przypadku bardzo długich list; wysadzają stos.
Systemy typów są nieco inne: w Caml adnotacja typu w wyrażeniu e : tyjest akceptowana, jeśli typ jest tyujednolicony z typem e. W SML e : tyjest akceptowane tylko wtedy, gdy typ tyjest wystąpieniem typu e. To rozróżnienie sprawia, że adnotacja w języku Caml jest znacznie mniej przydatna w praktyce, ponieważ nie można użyć adnotacji typu, aby twierdzić, że wyrażenie jest polimorficzne.
Caml ma znacznie bardziej rozsądny i rozsądny związek między interfejsami (zwanymi typami modułów lub sygnaturami ) a (konkretnymi) implementacjami (zwanymi modułami lub strukturami ) niż SML. W SML prawie wszystko jest dozwolone i musisz polegać na programiście, aby ustanowił dobre konwencje. W Caml dobre konwencje są ustanawiane i egzekwowane przez kompilator.
W SML operatory arytmetyczne są przeciążane w celu zastosowania zarówno do danych zmiennoprzecinkowych, jak i całkowitych. W Caml operatorzy nie są przeciążeni; Operatory zmiennoprzecinkowe są oznaczane dodatkową kropką.
W SML programista może kontrolować pierwszeństwo i asocjatywność operatorów wrostków. W Caml określa je pierwszy znak imienia operatora. To ograniczenie ogranicza korzyści wynikające z możliwości zdefiniowania własnej notacji wrostek.
Aby uzyskać bardziej szczegółową analizę wraz z komentarzem redakcyjnym, możesz również spojrzeć na stronę porównawczą Adama Chlipali .
Zapomniałeś o równości (nieograniczone i niebezpieczne w OCaml vs bezpieczne, ale ograniczone typy równości w SML), nieuogólnione zmienne typu ('_a w OCaml), printf, interpretacja nazw plików jako nazw modułów w OCaml, znacznie więcej currying w standardowym pliku OCaml. Napisałeś interfejs dwa razy, kiedy miałeś na myśli coś innego (implementację?) Za drugim razem.
JD
1
i OCaml's or-patterns i osłony w dopasowaniu wzorców.
JD
1
Należy zauważyć, że ograniczenie użyteczności adnotacji typu zostało nieco złagodzone w 3.12, gdzie adnotacje e : 'a . ty(a)są możliwe i znaczące.
4
Dokonujesz ważnej obserwacji: „Biblioteka Caml jest bardzo konieczna”. Wydaje się, że przenika to całą filozofię, do tego stopnia, że równoległa implementacja na sprzęcie wielordzeniowym wydaje się być bardzo trudna lub niemożliwa. W przeciwieństwie do tego istnieją co najmniej dwa równoległe SML: Mlton i Poly / ML.
Makarius
2
Po trzecie, nazwy rekordów nie wymagają już unikalności w OCaml.
PatJ
31
Aby uzyskać szczegółowe informacje na temat różnic składniowych, o których wspomniał Norman Ramsey, oto kilka stron internetowych:
Odpowiedzi:
Jest wiele różnic, niektóre techniczne, niektóre społeczno-polityczne. Próbowałem najpierw umieścić ważniejsze różnice.
SML to język z definicją i standardem. Jest stabilny (i faktycznie został zamrożony, więc nie może ewoluować). Objective Caml to realizacja kontrolowana przez małą grupę w INRIA. Nadal ewoluuje. (IMO ewolucja jest dobrze zarządzana.)
SML ma wiele implementacji; Caml ma tylko jedną.
Obiektyw Caml posiada szereg dodatkowych cech, wśród których najwybitniejsze są prawdopodobnie obiekty i warianty polimorficzne.
Te dwa języki mają radykalnie różne modele typów rekordów. Krótko mówiąc, w Caml nazwy pól rekordów muszą być unikalne, podczas gdy w SML dwa różne typy rekordów w tym samym zakresie mogą mieć wspólne nazwy pól. To dziwactwo może sprawić, że przenoszenie z SML na Caml będzie trochę trudne.
Istnieje kilka różnic składniowych.
Biblioteki i standardowe funkcje są diametralnie różne. Biblioteka Caml jest bardzo potrzebna, podczas gdy biblioteka SML Standard Basis jest bardziej funkcjonalna. Na przykład kompozycja funkcji jest prymitywem najwyższego poziomu w SML; nie jest częścią biblioteki Caml. Biblioteka ciągów Caml nie zapewnia funkcji zwijania (przynajmniej nie w wersji 3.08). Implementacje wielu
List
funkcji Caml są niebezpieczne w przypadku bardzo długich list; wysadzają stos.Systemy typów są nieco inne: w Caml adnotacja typu w wyrażeniu
e : ty
jest akceptowana, jeśli typ jestty
ujednolicony z typeme
. W SMLe : ty
jest akceptowane tylko wtedy, gdy typty
jest wystąpieniem typue
. To rozróżnienie sprawia, że adnotacja w języku Caml jest znacznie mniej przydatna w praktyce, ponieważ nie można użyć adnotacji typu, aby twierdzić, że wyrażenie jest polimorficzne.Caml ma znacznie bardziej rozsądny i rozsądny związek między interfejsami (zwanymi typami modułów lub sygnaturami ) a (konkretnymi) implementacjami (zwanymi modułami lub strukturami ) niż SML. W SML prawie wszystko jest dozwolone i musisz polegać na programiście, aby ustanowił dobre konwencje. W Caml dobre konwencje są ustanawiane i egzekwowane przez kompilator.
W SML operatory arytmetyczne są przeciążane w celu zastosowania zarówno do danych zmiennoprzecinkowych, jak i całkowitych. W Caml operatorzy nie są przeciążeni; Operatory zmiennoprzecinkowe są oznaczane dodatkową kropką.
W SML programista może kontrolować pierwszeństwo i asocjatywność operatorów wrostków. W Caml określa je pierwszy znak imienia operatora. To ograniczenie ogranicza korzyści wynikające z możliwości zdefiniowania własnej notacji wrostek.
Aby uzyskać bardziej szczegółową analizę wraz z komentarzem redakcyjnym, możesz również spojrzeć na stronę porównawczą Adama Chlipali .
źródło
e : 'a . ty(a)
są możliwe i znaczące.Aby uzyskać szczegółowe informacje na temat różnic składniowych, o których wspomniał Norman Ramsey, oto kilka stron internetowych:
źródło
OCaml dodaje funkcje obiektowe i ma drobne różnice w składni.
źródło