0

パッケージ 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 を使用する必要がありました)。そのため、古いバージョンでは問題は発生しません。答えてくれてありがとう。

4

3 に答える 3

0

必要なモジュール名を使用して関数を参照するだけです。

(+)fromが必要な場合はPervasivesPervasives.(+) x y代わりにx + y.

于 2014-06-29T07:38:32.197 に答える
0

ビルドに使用しているコマンドは何ですか? ビルドターゲットを指定していない場合(つまり、コマンドがocamlbuild a.mlの代わりにocamlbuild a.ml a.nativeなっている場合)、そうでなくてもコンパイルされているように見えるためです。

「ocamlfind ocamlc -package battery a.ml」を実行すると実際に何が起こっているかというと、from nums がfrom from Pervasives+に影を落としているということです。+

let a = Pervasives.(+) 4 4;;、またはNumsを開く代わりに、そのようなすべてに対して行うことができますNums.

于 2014-06-28T21:59:51.353 に答える
0

この問題に直面したときに使用した解決策は、Pervasive を開いてバッテリーの値を上書きすることです。

open Batteries
open Num
open Pervasives

let a = 4 + 4;;
于 2014-06-30T09:22:11.603 に答える