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 jest ty
ujednolicony z typem e
. W SML e : ty
jest akceptowane tylko wtedy, gdy typ ty
jest 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 .
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:
OCaml dodaje funkcje obiektowe i ma drobne różnice w składni.