Типы модулей OCaml и отдельная компиляция

Я читаю статью ведущего дизайнера OCaml 1994 года о модулях, типах и раздельной компиляции. (на меня любезно указал Норман Рэмсив другом вопросе). Насколько я понимаю, в документе обсуждается происхождение нынешней системы типов/подписей модулей OCaml. Для этого автор предлагает непрозрачную интерпретацию объявлений типов в сигнатурах (чтобы разрешить раздельную компиляцию) вместе с объявлениями типов манифеста (для выразительности). Пытаясь собрать несколько собственных примеров, чтобы продемонстрировать, какие проблемы пытается решить нотация подписи модуля OCaml, я написал следующий код в двух файлах:

В файле ordering.ml(или .mli— пробовал и то, и другое) ( файл A):

module type ORDERING = sig
 type t
 val isLess : t -> t -> bool
end

и в файле useOrdering.ml( файл B):

open Ordering
module StringOrdering : ORDERING
  let main () =
    Printf.printf "%b" StringOrdering.isLess "a" "b"
  main ()

Идея состоит в том, чтобы ожидать, что компилятор будет жаловаться (при компиляции второго файла), что в модуле недостаточно информации о типах StringOrderingдля проверки типа приложения StringOrdering.isLess(и, таким образом, мотивировать потребность в синтаксисе с типом ). Однако, хотя файл A компилируется, как и ожидалось, файл B заставляет 3.11.2 ocamlcжаловаться на синтаксическую ошибку. Я понял, что сигнатуры предназначены для того, чтобы позволить кому-то писать код на основе сигнатуры модуля без доступа к реализации (структуре модуля).

Признаюсь, что я не уверен в синтаксисе: модуль A : Bс которым я столкнулся в этой довольно старой статье по раздельной компиляциино это заставляет меня задуматься, такой или подобный существует синтаксис (без использования функторов), позволяющий кому-то писать код, основываясь только на типе модуля, с фактической структурой модуля, предоставляемой во время компоновки, аналогично тому, как можно использовать *.hи * .cфайлы в C/C++. Без такой возможности может показаться, что типы/подписи модулей в основном предназначены для запечатывания/скрытия внутренностей модулей или более явной проверки типов/аннотаций, но не для отдельной/независимой компиляции.

На самом деле, глядя на раздел руководства OCaml, посвященный модулям и отдельной компиляции, кажется, что моя аналогия с единицами компиляции C не работает, потому что руководство OCaml определяет единицу компиляции OCaml как A. mlи A.mliдуэт, тогда как в C/C++ .hвставляются в модуль компиляции любого импортирующего файла .c.

8
задан Community 23 May 2017 в 11:45
поделиться