Я читаю через OCaml lead designer's 1994 paper on modules, types, and separate compilation. (любезно указал на меня Norman Ramsey в another question). Я понимаю, что в документе обсуждается происхождение нынешней системы типа/подписи системы OCaml. Это он, автор предлагает непрозрачную интерпретацию деклараций типов в подписях (чтобы разрешить раздельную компиляцию) вместе с декларациями манифеста (для выразительности). Попытка собрать воедино некоторые примеры моих собственных, чтобы продемонстрировать вид проблем OCaml модуль подписи нотация пытается решить я написал следующий код в двух файлах:Типы модулей OCaml и отдельная компиляция
В файле ordering.ml
(или .mli
- Я пробовал оба) (файл а):
module type ORDERING = sig
type t
val isLess : t -> t -> bool
end
и в файле useOrdering.ml
(файл в):
open Ordering
module StringOrdering : ORDERING
let main() =
Printf.printf "%b" StringOrdering.isLess "a" "b"
main()
Идея состоит в том, чтобы ожидать, что компилятор будет жаловаться (при компиляции второго файла), который недостаточно для информации о типе, доступен на модуле StringOrdering
для typecheck приложения StringOrdering.isLess
(и тем самым мотивирует необходимость синтаксиса with type
). Однако, хотя файл A компилируется, как ожидается, файл B вызывает 3.11.2 ocamlc
, чтобы жаловаться на синтаксическую ошибку. Я понял, что подписи должны позволять кому-то писать код на основе подписи модуля, без доступа к реализации (структура модуля).
Я признаю, что я не уверен, о синтаксисе: module A : B
который я столкнулся в this rather old paper on separate compilation, но это заставляет меня задаться вопросом, существует ли такой или подобный синтаксис (без участия функторов), чтобы позволить кому-то писать код, основанный только на тип модуля, с фактической структурой модуля, предоставленной во время связывания, подобно тому, как можно использовать файлы *.h
и *.c
на C/C++. Без такой возможности, казалось бы, что типы модулей/сигнатуры в основном предназначены для герметизации/скрытия внутренних модулей или более явной проверки/аннотации типов, но не для отдельной/независимой компиляции.
На самом деле, глядя на OCaml manual section on modules and separate compilation, кажется, что моя аналогия с C единицей компиляции нарушаются, так как руководство OCaml определяет OCaml единицы компиляции, чтобы стать A.ml
и A.mli
дуэтом, в то время как в C/C++ в .h
файлах вставляются в единица компиляции любого импортирующего файла .c
.
Как на мгновение ответ Томаса, по умолчанию для отдельной компиляции нет отдельной компиляции. Я бы хотел, чтобы это было, и я вошел в это желание в богослужении: http://caml.inria.fr/mantis/view.php?id=4389. Если кто-то знает, как получить отдельную собственную компиляцию в OCaml (поскольку Томас на мгновение утверждал, что это возможно), я бы ЧРЕЗВЫЧАЛ заинтересоваться, услышав об этом. –
@PascalCuoq: Почему вы говорите, что вы не можете самостоятельно скомпилировать собственный код в Ocaml? Конечно вы можете. –
На самом деле, я только что изменил два файла, как это было предложено в ответе Томаса, и вы можете скомпилировать отдельно либо байт-код (ocamlc), либо native (ocamlopt). –