Разница между модулем <name>= struct .. end и типом модуля <name>= struct .. end? - PullRequest
6 голосов
/ 28 октября 2010
module <name> =
   struct 
     .. 
   end;;


module type <name> =
    struct (* should have been sig *)
      .. 
end;;

Ответы [ 3 ]

8 голосов
/ 28 октября 2010

Первый объявляет модуль, а второй объявляет тип модуля (он же сигнатура). Тип модуля содержит объявления type и val, тогда как модуль может содержать определения (например, let привязки). Вы можете использовать сигнатуру для ограничения типа модуля, так же как и для функции. Например,

module type T = sig
  val f : int -> int
end

module M : T = struct
  let f x = x + 1
  let g x = 2 * x
end

Теперь у нас есть

# M.f 0 ;;
- : int = 1
# M.g 0 ;;
Error: Unbound value M.g

M.g не связан, поскольку скрыт подписью T.

Другой распространенный способ использования типов модулей - это аргументы и возвращаемые значения функторов. Например, функтор Map.Make в стандартной библиотеки принимает модуль с подписью Map.OrderedType и создает модуль с подписью Map.S

P.S. Обратите внимание, что в вопросе есть ошибка. Тип модуля объявлен с использованием

module type <name> = sig
  ...
end
4 голосов
/ 28 октября 2010

A структура (записано struct … end) - это набор определений .Любой объект на языке может быть определен в модуле: основные значения (let x = 2 + 2), типы (type t = int), модули (module Empty = struct end), подписи (module type EMPTY = sig end) и т. Д. Модули являются обобщением структур: структура является модулем, и функтор (воспринимается как функция, которая принимает модуль в качестве аргумента и возвращает новый модуль).Модули похожи на значения ядра, но живут на один уровень выше: модуль может содержать все что угодно, тогда как значение ядра может содержать только другие значения ядра core.

A сигнатура (записано sig … end)куча спецификаций (некоторые языки используют термин объявление ).Любой объект на языке может быть указан в модуле: основные значения (val x : int), типы (type t = int), модули (module Empty : sig end), подписи (module type EMPTY = sig end) и т. Д. Типы модулей обобщить подписи: тип модуля определяет модуль, а тип модуля, который определяет структуру, называется подписью.Типы модулей относятся к модулям так же, как обычные типы к основным значениям.

Единицы компиляции (файлы .ml) - это структуры.Интерфейсы (.mli файлы) являются сигнатурами.

Итак, module Foo = struct … end определяет модуль с именем Foo, который является структурой.Это аналогично let foo = (1, "a"), который определяет значение с именем foo, которое является парой.И module type FOO = sig … end (примечание: sig, а не struct) определяет тип модуля с именем FOO, который является сигнатурой.Это аналогично type foo = int * string, который определяет тип с именем foo, который является типом продукта.

¹ На самом деле это уже не так, поскольку в OCaml 3.12 были введены первоклассные модули, ноэто достаточно близко для вступительной презентации.

0 голосов
/ 28 октября 2010

тип модуля описывает модуль. Это то же самое, что разница между .ml и .mli

...