Как предотвратить перезарядку батарей OCaml

Пакет 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 локально.

Но я могу успешно скомпилировать эту программу с помощью ocamlbuild с самым простым файлом _tags: <*>: pkg_batteries, package (battery), package(num)

Где магия? Как я могу скомпилировать как ocamlbuild с Makefile?

РЕДАКТИРОВАТЬ: я нашел решение. На самом деле у меня было две версии батарей (1.4 и 2.2), и ocamlfind предоставил версию 2.2 в командной строке и 1.4 для ocamlbuild. Я не знаю почему. Я считаю, что ранние версии батарей не переопределяли модуль Num (но вы должны были использовать BatNum), поэтому проблема не возникает со старой версией. Спасибо за ответы.

3 ответа

Какую команду вы используете для сборки? Потому что, если вы не указываете цель сборки (т.е. ваша команда ocamlbuild a.ml вместо ocamlbuild a.ml a.native) он будет выглядеть так, как будто его компилируется, хотя это не так.

Что на самом деле происходит, когда вы пытаетесь "ocamlfind ocamlc -package battery a.ml" является то, что + от чисел омрачает + из повсеместного

Вы могли бы сделать let a = Pervasives.(+) 4 4;;или вместо открытия Nums сделайте Nums. за все такое.

Решение, которое я использовал, когда столкнулся с этой проблемой, заключается в открытии Pervasive для переопределения значений Battery.

open Batteries
open Num
open Pervasives

let a = 4 + 4;;

Вы можете просто обратиться к функции, используя нужное имя модуля.

Если вы хотите (+) от PervasivesСкажи Pervasives.(+) x y вместо x + y,

Другие вопросы по тегам