Я читаю статью ведущего дизайнера 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
.