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

Я неправильно понимаю это, или здесь что-то еще происходит?


person sorrysorrysorrysorry    schedule 29.08.2011    source источник
comment
stackoverflow.com/questions/3238509 /   -  person andrew cooke    schedule 29.08.2011


Ответы (2)


Модульная система OCaml привязана к отдельной компиляции (пары файлов .ml и .mli). Таким образом, каждый .ml файл неявно определяет модуль, каждый .mli файл определяет подпись, и если есть соответствующий .ml файл, эта подпись применяется к этому модулю.

Полезно иметь явный синтаксис для управления модулями и интерфейсами по своему усмотрению внутри файла .ml или .mli. Это позволяет заменять типы, как в S with type t = M.t. Не в последнюю очередь это возможность определять функторы, модули, параметризованные одним или несколькими модулями: module F (X : S) = struct ... end. Все это было бы невозможно, если бы единственный способ определить модуль или подпись - это файл.

Я не уверен, как это отвечает на ваш вопрос, но я думаю, что ответ на ваш вопрос, вероятно, таков: «Да, это так просто, как вы думаете, и система наличия .mli файлов и явных подписей внутри файлов очень сильна. > избыточно в вашем примере. Манипулирование модулями и подписями внутри файла позволяет использовать более сложные трюки в дополнение к этим простым вещам ".

person Pascal Cuoq    schedule 29.08.2011

Это старый вопрос, но, возможно, он кому-то будет полезен:

Файл с именем a.ml появляется в программе как модуль A ... Интерфейс модуля a.ml можно записать в файл с именем a.mli.

ссылка на слайд

Это из МООК OCaml Парижского университета Дидро.

person Ignacio    schedule 12.12.2016