Jakie są różnice między SML a OCaml? [Zamknięte]

Odpowiedzi:

157

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 ty ujednolicony 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 .

Norman Ramsey
źródło
4
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
-3

OCaml dodaje funkcje obiektowe i ma drobne różnice w składni.

Charlie Martin
źródło