Подтвердить что ты не робот

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

Неужели я не понимаю этого, или здесь что-то еще происходит?

4b9b3361

Ответ 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.