Что отличает эти два диалекта ML?
Ответы:
Есть много различий, некоторые технические, некоторые социально-политические. Я попытался поставить на первое место более важные отличия.
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 они определяются первым символом имени оператора. Это ограничение ограничивает преимущества возможности определять собственную инфиксную нотацию.
Для более подробного анализа с комментариями редакции вы также можете взглянуть на страницу сравнения Адама Члипалы .
e : 'a . ty(a)
возможно и имеет смысл.
Для получения подробной информации о синтаксических различиях, упомянутых Норманом Рэмси, вот пара веб-страниц:
OCaml добавляет функции объектной ориентации и имеет некоторые незначительные синтаксические различия.