Что отличает два диалекта ML?В чем разница между SML и OCaml?
ответ
Есть много различий, некоторые технические, некоторые социально-политические. Сначала я попытался внести более важные отличия.
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 программист может управлять приоритетом и ассоциацией операторов infix. В Caml они определяются первым символом имени оператора.Это ограничение ограничивает преимущества, позволяющие определить вашу собственную инфиксную нотацию.
Для более подробного анализа в комплекте с редакционным комментарием вы также можете посмотреть Adam Chlipala's comparison page.
очень познавательно! мой +1 для этого. –
Вы забыли равенство (неограниченное и небезопасное в OCaml по сравнению с безопасными, но ограниченными типами ограничений в SML), переменные не обобщенного типа ('_a в OCaml), printf, интерпретация имен файлов в качестве имен модулей в OCaml, гораздо больше currying в stdlib OCaml , Вы дважды писали интерфейс, когда вы имели в виду что-то еще (реализация?) Во второй раз. –
и OCaml или шаблоны и защитные устройства в соответствии с шаблоном. –
OCaml добавляет функции объектной ориентации и имеет некоторые незначительные различия в синтаксисе.
Более подробные сведения о синтаксических различий, Norman Ramsey упомянутые, вот несколько веб-страниц:
- Comparing Objective Caml and Standard ML: есть хорошие объяснения различий, и «практические» против «чистые» иконки забавно слишком
- Standard ML and Objective Caml, Side by Side
синтаксический сравнения: http://adam.chlipala.net/mlcomp/ – nawfal