Интерфейс OCaml против подписи?
Я немного запутался в интерфейсах против подписей в OCaml.
Из того, что я прочитал, интерфейсы (файлы .mli) определяют, какие значения могут использоваться/называться другими программами. Файлы подписи выглядят так, как будто они одинаковы, за исключением того, что они называют это, так что вы можете создавать различные реализации интерфейса.
Например, если я хочу создать модуль, похожий на набор в Java:
У меня было бы что-то вроде этого:
файл set.mli:
type 'a set
val is_empty : 'a set -> bool
val ....
etc.
Файл подписи (setType.ml)
module type Set = sig
type 'a set
val is_empty : 'a set -> bool
val ...
etc.
end
а затем реализация будет другим .ml файлом, таким как SpecialSet.ml, который включает в себя структуру, которая определяет все значения и что они делают.
module SpecialSet : Set
struct
...
Я немного смущен относительно того, что именно делает "подпись" и какая цель она служит. Разве это не похоже на какой-то интерфейс? Почему нужны оба .mli и .ml? Единственное отличие строк, которые я вижу, это то, что он называет модуль.
Неужели я не понимаю этого, или здесь что-то еще происходит?
Ответы
Ответ 1
Модульная система OCaml привязана к отдельной компиляции (пары файлов .ml
и .mli
). Таким образом, каждый .ml
файл неявно определяет модуль, каждый .mli
файл определяет подпись, и если есть соответствующий файл .ml
, подпись которого применяется к этому модулю.
Полезно иметь явный синтаксис для манипулирования модулями и интерфейсами с одной симпатией внутри файла .ml
или .mli
. Это позволяет замену типов, как в S with type t = M.t
.
Не в последнюю очередь это возможность, которую он дает для определения функторов, модулей, параметризованных одним или несколькими модулями: module F (X : S) = struct ... end
. Все это было бы невозможно, если бы единственный способ определить модуль или подпись был в виде файла.
Я не уверен, как это отвечает на ваш вопрос, но я думаю, что ответ на ваш вопрос, вероятно, "да, это так просто, как вы думаете, и система наличия файлов .mli
и явных подписей внутри файлов избыточен в вашем примере. Манипуляция модулями и сигнатурами внутри файла позволяет более сложные трюки в дополнение к этим простым вещам".
Ответ 2
Этот вопрос старый, но, возможно, это кому-то полезно:
"A file named a.ml appears as a module A in the program...
The interface of the module a.ml can be written in file named a.mli"
слайд-ссылка
Это из OCAML MOOC из Université Paris Diderot.