Ответ 1
Существуют некоторые различия как по семантическим, так и по семантическим параметрам.
Особенности SML поддерживает, но не OCaml:
- прозрачная подпись с надписью
- уровень модуля
let
- симметричные ограничения совместного доступа
- синтаксический сахар для функторов над типами и значениями
Особенности OCaml 4 есть, но не SML:
- функторы высшего порядка
- рекурсивные модули
- локальные модули
- вложенные подписи
- модули как первоклассные ценности
- общий доступ к модулям (
sig with module A = M
) module type of
Однако некоторые реализации SML предоставляют некоторые из них как расширения: например, функторы высшего порядка (SML/NJ, Moscow ML, Alice ML), локальные и первоклассные модули (Moscow ML, Alice ML), совместное использование модулей (SML/NJ, Alice ML), вложенные подписи (Moscow ML, Alice ML) и рекурсивные модули (Москва М.Л.).
С точки зрения семантики самое большое различие заключается в обработке эквивалентности типов, особенно в отношении функторов:
В SML функторы являются генеративными, что означает, что применение одного и того же функтора дважды к одному и тому же аргументу всегда приводит к новым типам.
В OCaml функторы являются аппликативными, что означает, что применение одного и того же функтора дважды к одному и тому же аргументу (плюс дополнительные синтаксические ограничения) воспроизводит эквивалентные типы. Эта семантика более гибкая, но она также может нарушить абстракцию (см., Например, примеры, которые мы приводим в этой статье, раздел 8).
Правка: в OCaml 4 добавлена возможность по желанию сделать функторы генеративными.
OCaml имеет чисто синтаксическое представление о сигнатурах, что означает, что определенные эквивалентности типов не могут быть выражены системой типов и молча отбрасываются.
Изменить: Рассмотрите этот пример:
module F (X : sig type t end) = struct type u = X.t -> unit type v = X.t end module M = F (struct type t = int end : sig type t end)
Тип
M
простоsig type u type v end
и, таким образом, потерял любую информацию о связи между его типамиu
иv
, потому что это обычно не может быть выражено в поверхностном синтаксисе.
Другое заметное отличие состоит в том, что система типов модулей OCaml неразрешима (т.е. проверка типов может не прекратиться) из-за разрешения абстрактных подписей, которое не допускает SML.