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