2015-01-08 2 views
1

У меня есть библиотека, в которой общие типы данных определены в модуле подписи (копирование этой подписи в реализацию не имеет смысла, поскольку оно не содержит никакой функции):Включить файл подписи (.mli) в библиотеке

(* b.mli *) 
type bar = A of int | B of float 

(* a.ml: *) 
let foo = function B.A i -> B.A (i+1) 
       | B.B f -> B.B (f +. 1.) 

(* c.mllib *) 
A 
B 

в приведенной выше настройке, ocamlbuild не удается создать библиотеку с довольно неожиданной ошибкой:

[email protected] /tmp/test % ocamlbuild c.cmxa 
Solver failed: 
    Ocamlbuild cannot find or build c.ml. A file with such a name would usually be a source file. I suspect you have given a wrong target name to Ocamlbuild. 

можно построить без указания B внутри файла mllib, но бар типа становится абстрактным (который не предназначено). Есть ли способ включить подпись с помощью ocamlbuild?

ответ

2

Вы не можете установить модуль B в библиотеку, потому что он не существует. У вас есть только скомпилированный интерфейс, но не скомпилированный модуль, т. Е. Блок компиляции. Цель cmxa - быть контейнером для скомпилированного кода, поскольку ваш интерфейс B не содержит никакого кода. В библиотеку ничего не может быть добавлено. Это означает, что вам совсем не нужно указывать ссылку на модуль B в файл mllib.

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

type bar = A of int | B of float with sexp 

Но, если вы все еще хотите иметь mli без ml, тогда я предлагаю вам использовать oasis. Он имеет функцию под названием pure_interface, которая позволяет создавать такие библиотеки.

+0

Это имеет смысл. Вероятно, не стоит привыкать к использованию пакета, поскольку он не поддерживает псевдоним модуля. – nlucaroni

 Смежные вопросы

  • Нет связанных вопросов^_^