Я немного запутался в отношении интерфейсов и сигнатур в 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? Единственная разница в строках, которые я вижу, заключается в том, что он называет модуль.
Я неправильно понимаю это, или здесь что-то еще происходит?