В чем разница между SML и OCaml? [закрыто]

99

Что отличает эти два диалекта ML?

Натан
источник
3
Синтаксическое сравнение: adam.chlipala.net/mlcomp
nawfal

Ответы:

157

Есть много различий, некоторые технические, некоторые социально-политические. Я попытался поставить на первое место более важные отличия.

  • SML - это язык с определением и стандартом. Он стабилен (и фактически был заморожен, поэтому не может развиваться). Objective Caml - это реализация, контролируемая небольшой группой INRIA. Он продолжает развиваться. (ИМО, эволюция управляется хорошо.)

  • SML имеет множество реализаций; У Камла только один.

  • Objective Caml имеет ряд дополнительных функций, среди которых, вероятно, наиболее заметными являются объекты и полиморфные варианты.

  • Эти два языка имеют совершенно разные модели типов записей. Вкратце, в Caml имена полей записей должны быть уникальными, тогда как в SML два разных типа записей в одной и той же области могут иметь общие имена полей. Эта причуда может немного усложнить перенос с SML на Caml.

  • Есть довольно много синтаксических различий.

  • Библиотеки и стандартные функции кардинально отличаются. Библиотека Caml очень важна, тогда как Стандартная базовая библиотека SML более функциональна. Например, композиция функций - это примитив верхнего уровня в SML; это не часть библиотеки Caml. Библиотека строк Caml не предоставляет функцию сворачивания (по крайней мере, в версии 3.08). Реализации многих Listфункций Caml небезопасны для очень длинных списков; они взорвали стек.

  • Системы типов немного отличаются: в Caml аннотация типа для выражения e : tyпринимается, если тип ty совпадает с типом e. В SML e : tyдопускается, только если тип tyявляется экземпляром типа e. Это различие делает аннотацию в Caml гораздо менее полезной на практике, потому что невозможно использовать аннотацию типа, чтобы настаивать на том, что выражение является полиморфным.

  • Caml имеет гораздо более разумные и разумные отношения между интерфейсами (называемыми типами модулей или сигнатурами ) и (конкретными) реализациями (называемыми модулями или структурами ), чем SML. В SML работает практически все, и вы должны положиться на программиста, чтобы установить хорошие соглашения. В Caml хорошие соглашения устанавливаются и соблюдаются компилятором.

  • В SML арифметические операторы перегружены для применения как к данным с плавающей запятой, так и к целочисленным данным. В Caml операторы не перегружены; Операторы с плавающей запятой помечаются дополнительной точкой.

  • В SML программист может управлять приоритетом и ассоциативностью инфиксных операторов. В Caml они определяются первым символом имени оператора. Это ограничение ограничивает преимущества возможности определять собственную инфиксную нотацию.

Для более подробного анализа с комментариями редакции вы также можете взглянуть на страницу сравнения Адама Члипалы .

Норман Рэмси
источник
4
Вы забыли равенство (неограниченное и небезопасное в OCaml по сравнению с безопасными, но ограниченными типами равенства в SML), переменные необобщенного типа ('_a в OCaml), printf, интерпретацию имен файлов как имен модулей в OCaml, гораздо больше каррирования в stdlib OCaml. Вы написали интерфейс дважды, когда второй раз имели в виду что-то другое (реализацию?).
JD
1
и OCaml-шаблоны и охранники в сопоставлении с образцом.
JD,
1
Обратите внимание, что ограничение полезности аннотаций типов было несколько смягчено в версии 3.12, где аннотирование e : 'a . ty(a)возможно и имеет смысл.
4
Вы делаете важное замечание: «Библиотека Caml очень необходима». Кажется, это пронизывает всю философию, вплоть до того, что параллельная реализация на многоядерном оборудовании кажется очень сложной или невозможной. Напротив, существует как минимум два параллельных SML: Mlton и Poly / ML.
Макариус
2
Что касается вашего третьего момента, имена записей больше не требуют уникальности в OCaml.
PatJ
-3

OCaml добавляет функции объектной ориентации и имеет некоторые незначительные синтаксические различия.

Чарли Мартин
источник