Какая разница (если таковая имеется) между стандартной модульной системой ML и системой модулей OCaml?

Мой вопрос в том, есть ли разница между стандартной модульной системой ML и системой модулей OCaml? Обладает ли OCaml поддержкой функторов, подписок и т.д.... что SML имеет?

Ответ 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.

Ответ 2

Что касается семантики, то гораздо лучший и продуманный ответ дает Андреас Росберг выше. Однако в отношении синтаксиса этот сайт может быть тем, что вы ищете.

Ответ 3

В SML также есть средство abstype, которое похоже на средство типа данных, за исключением того, что оно скрывает структуру типа данных. OCaml полагается на абстракцию модуля, чтобы скрыть все, что необходимо. Обратите внимание, что этот сайт не упоминает эту возможность в SML.