2014-06-28 3 views
0

В пакет Batteries.Num перекрывает функции (+), (-) ... Так что компилятор выдает ошибку на следующем простом кодеКак предотвратить OCAML батареи переопределение значений

open Batteries 
open Num 
let a = 4 + 4;; 

Файл " a.ml "линия 3, 8-9 символов: Ошибка: Это выражение имеет тип INT, но выражение ожидалось типа Batteries.Num.num = Num.num

компилировать с" ocamlfind ocamlc -package батареи a.ml ".

EDIT: Я знаю, что могу использовать Pervasives. (+) Или просто открыть Num локально.

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

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

EDIT: Я нашел решение. У меня на самом деле были две версии батарей (1.4 и 2.2), а ocamlfind предоставил версию 2.2 в командной строке и 1.4 на ocamlbuild. Я не знаю почему. Я считаю, что ранняя версия батарей не переопределила модуль Num (но вам пришлось использовать BatNum), поэтому проблема не возникает с более старой версией. Спасибо за ответы.

ответ

0

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

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

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

+0

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

0

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

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

0

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

open Batteries 
open Num 
open Pervasives 

let a = 4 + 4;; 
Смежные вопросы