Что отличает два диалекта ML?
Каковы различия между SML и OCaml?
Ответ 1
Есть много различий, некоторые технические, некоторые социально-политические. Сначала я попытался внести более важные отличия.
-
SML - это язык с определением и стандартом. Он стабилен (и фактически заморожен, поэтому он не может развиваться). Цель Caml - это реализация, контролируемая небольшой группой в INRIA. Он продолжает развиваться. (ИМО эволюция хорошо управляется.)
-
SML имеет множество реализаций; Caml имеет только один.
-
Объектив Caml имеет ряд дополнительных функций, среди которых наиболее заметными являются, вероятно, объекты и полиморфные варианты.
-
На двух языках существуют совершенно разные модели типов записей. Вкратце, в Caml имена полей записей должны быть уникальными, где в SML два разных типа записей в одной области могут иметь общие имена полей. Эта причуда может сделать перенос с SML на Caml немного сложнее.
-
Существует довольно много синтаксических различий.
-
Библиотеки и стандартные функции сильно различаются. Библиотека Caml очень важна, тогда как базовая библиотека SML является более функциональной. Например, состав функций является примитивом верхнего уровня в SML; это не часть библиотеки Caml. Строковая библиотека Caml не предоставляет функцию сгиба (по крайней мере, не начиная с версии 3.08). Реализации многих функций Caml
List
небезопасны для очень длинных списков; они взрывают стек. -
Системы типов очень разные: в Caml аннотация типа в выражении
e : ty
принимается, если типty
объединяется с типомe
. В SMLe : ty
принимается, только если типty
является экземпляром типаe
. Это различие делает аннотацию в Caml гораздо менее полезной на практике, потому что невозможно использовать аннотацию типа, чтобы настаивать на том, что выражение является полиморфным. -
Caml имеет гораздо более разумную и разумную взаимосвязь между интерфейсами (называемыми типами модулей или сигнатурами) и (конкретными) реализациями (называемыми модулями или структурами), чем SML. В SML почти все идет, и вы должны полагаться на программиста, чтобы установить хорошие соглашения. В Caml хорошие соглашения устанавливаются и выполняются компилятором.
-
В SML арифметические операторы перегружены для применения как к плавающим, так и к целочисленным данным. В Caml операторы не перегружены; Операторы с плавающей запятой обозначаются дополнительной точкой.
-
В SML программист может контролировать приоритет и ассоциативность инфиксных операторов. В Caml они определяются первым символом имени оператора. Это ограничение ограничивает преимущества того, что вы можете определить свою собственную инфиксную нотацию.
Для более подробного анализа, дополненного редакционным комментарием, вы также можете посмотреть страницу сравнения Адама Хлипалы.
Ответ 2
Подробнее о синтаксических различиях, о которых упомянул Норман Рэмси, вот несколько веб-страниц:
- Сравнение Objective Caml и стандартного ML: имеет хорошие объяснения различий, а "практические" и "чистые" значки тоже забавны
- Стандартный ML и Objective Caml, Side by Side
Ответ 3
OCaml добавляет функции объектной ориентации и имеет некоторые незначительные различия в синтаксисе.