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 были введены первоклассные модули, ноэто достаточно близко для вступительной презентации.