как получить доступ к типу, определенному в одном файле .ml в другом файле .ml - PullRequest
5 голосов
/ 12 мая 2010

В a.ml тип записи t определен, а также определен прозрачно в a.mli, то есть в интерфейсе d, так что определение типа доступно ко всем остальным файлам.

a.ml также имеет функцию func, которая возвращает список t.

Теперь в другом файле, b.ml я называю func, теперь, очевидно, ocaml компилятор не сможет вывести d-тип объектов, хранящихся в d-списке, для компилятора это просто список. так что в b.ml у меня есть что-то вроде dis,

let tlist = A.func in
let vart = List.hd tlist in
printf "%s\n" vart.name     (*name is a field in record t*)

Теперь здесь я получаю сообщение об ошибке компилятора, указывающее на «несвязанную метку поля записи». name ", что имеет смысл, так как компилятор не может вывести тип d vart.

мой первый вопрос: как я могу явно указать тип d vart как t Вот? я пытался сделать "let vart: A.t =", но получил та же ошибка.

Я также пытался создать другую функцию для извлечения первого элемента d список и упоминание типа возврата как A.t, но затем я получил «Unbound значение A.t ". Я сделал это:

let firstt = function
     [] -> 0
   | x :: _ -> A.t x ;;

Проблема в том, что компилятор не может распознать A.t (тип) в b.ml но умеет распознавать функцию A.func. Если я удалю A.t из b.ml, я не получаю никаких ошибок компилятора.

Ответы [ 2 ]

7 голосов
/ 12 мая 2010

Компилятор способен распознавать A.t для обозначения типа t из файла a.ml.

С другой стороны, t x, где t является типом, а x переменная не является допустимым выражением. Это источник вашей проблемы. Компилятор ищет имя t в переменных, экспортируемых a.ml. Поскольку он не может найти это имя для переменной, он сообщает об ошибке.

Теперь за то, что вы пытались сделать:

  • аннотации типов не являются подсказками для компилятора в OCaml. У него есть алгоритм, позволяющий вывести тип (самый общий, за некоторыми исключениями, в которые я не вхожу), и затем он проверяет, что ваша аннотация является, по крайней мере, конкретизацией наиболее общего типа. Предоставляемая вами аннотация типа никогда (опять же, за некоторыми возможными исключениями, которые вас не касаются) не заставит ее передумать.

  • Для доступа в файле b.ml поле f записи r типа A.t, введите r.A.f.

0 голосов
/ 13 мая 2010
let tlist = A.func in
let vart = List.hd tlist in
printf "%s\n" vart.name     (*name is a field in record t*)

Здесь tlist - функция, я полагаю, она имеет тип 'a -> A.t list, но вы применяете List.hd к этой функции, когда пишете let vart = List.hd tlist.

Вы должны предоставить аргумент для своей функции, чтобы получить список A.t, например, let tlist = A.func (your_argument-s-_here), я думаю, это источник вашей ошибки, компилятор может выводить типы между модулями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...