パッケージ Batteries.Num は関数 (+)、(-) をオーバーライドします。したがって、コンパイラは次の単純なコードでエラーを返します。
open Batteries
open Num
let a = 4 + 4;;
ファイル "a.ml"、3 行目、8 ~ 9 文字目: エラー: この式は int 型ですが、Batteries.Num.num = Num.num 型の式が予期されていました
「ocamlfind ocamlc -package battery a.ml」でコンパイルします。
編集: Pervasives.(+) を使用するか、Num をローカルで開くことができることはわかっています。
しかし、最も単純な _tags ファイルを使用して、このプログラムを ocamlbuild で正常にコンパイルできます: <*>: pkg_batteries, package(batteries), package(num)
魔法はどこ?ocamlbuild が Makefile で行うようにコンパイルするにはどうすればよいですか?
編集:解決策を見つけました。実際には2つのバージョンのバッテリー(1.4と2.2)があり、ocamlfindはコマンドラインでバージョン2.2を、ocamlbuildで1.4を提供しました。どうしてか分かりません。バッテリーの初期のバージョンはモジュール Num を再定義しなかったと思います (ただし、BatNum を使用する必要がありました)。そのため、古いバージョンでは問題は発生しません。答えてくれてありがとう。