Как предотвратить перезарядку батарей 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
,