Как предотвратить переопределение значений батареек 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 батарейки a.ml".

РЕДАКТИРОВАТЬ: Я знаю, что могу использовать Pervasives. (+) Или просто открыть Num локально.

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

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

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


person user2946020    schedule 28.06.2014    source источник


Ответы (3)


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

Что ДЕЙСТВИТЕЛЬНО происходит, когда вы пробуете "ocamlfind ocamlc -package battery a.ml", так это то, что + от nums затмевает + от Pervasives.

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

person sacooper93    schedule 28.06.2014
comment
Да, я знаю, что могу использовать Pervasives. (+) Или просто использовать let open Num при необходимости. Моя проблема в том, что у меня есть код, который отлично компилируется с ocamlbuild, но не в командной строке (или Makefile). Я использую ocamlbuild -use-ocamlfind a.byte, который создает исполняемый файл, и снова ocamlbuild ocamlc -package батареи a.ml выдает ошибку типа. В основном у меня есть более крупный проект, который отлично компилируется с ocamlbuild, но мне нужно переключиться на OCamlMakefile, который по этой причине не работает. - person user2946020; 29.06.2014

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

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

person Jackson Tale    schedule 29.06.2014

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

open Batteries
open Num
open Pervasives

let a = 4 + 4;;
person Thomash    schedule 30.06.2014