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