Интерфейс OCaml против подписи? - PullRequest
12 голосов
/ 29 августа 2011

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

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

Ответы [ 2 ]

12 голосов
/ 29 августа 2011

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

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

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

1 голос
/ 12 декабря 2016

Этот вопрос старый, но, может быть, это кому-нибудь пригодится:

"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 из Университета Парижа Дидро.

...