1

共通のデータ型が署名のみのモジュールで定義されているライブラリがあります(機能が含まれていないため、その署名を実装にコピーしても意味がありません)。

(* 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 はかなり驚くべきエラーでライブラリの作成に失敗します:

choeger@daishi /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.

mllib ファイル内で B を指定せずにビルドできますが、タイプ バーが抽象化されます (これは意図したものではありません)。ocamlbuild を使用して署名を含める方法はありますか?

4

1 に答える 1

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、そのようなライブラリを構築できます。

于 2015-01-08T15:00:14.397 に答える