2014-09-05 3 views
2

Использование ocaml 4.01.0 и core 111.17.00, как установлено opam.ocaml вложенные модули: реализация ml не соответствует интерфейсу cmi

У меня есть две проблемы, которые, вероятно, связаны с тем, что я сводился к следующим упрощенным модулям.

У меня есть внешний модуль (Zee здесь), который содержит внутренний модуль (Foo). Моя основная программа находится в xx.ml.

Первая проблема заключается в том, что, когда я строю, используя corebuild xx.byte, я получаю сообщение об ошибке:

File "zee.ml", line 1: 
Error: The implementation zee.ml does not match the interface zee.cmi: 
     The field `Foo' is required but not provided 

Вторая проблема, которая может вытекать из что я делаю неправильно, чтобы вызвать эту ошибку, что если Я раскомментировать закомментированный код в xx.ml ниже, я получаю:

File "xx.ml", line 3, characters 23-32: 
Error: Unbound module Zee.Foo 

Я новичок в OCaml, но у меня есть другой код с вложенными модулями, которые, кажется, работает. Я не мог понять, что отличает эта ситуация, которая вызывает эти ошибки. Есть ли что-то в объявлении подписей модулей внутри других модулей, которые мне не хватает?

Вот код (отдельные файлы, как показано заголовками):

(**** zee.mli ****) 
module type Foo = sig 
    val x : int 
end 

val bar : int 

(**** zee.ml ****) 
module Foo = struct 
    let x = 10 
end 

let bar = 20 

(**** xx.ml ****) 
open Core.Std 

(* 
let() = printf "%d\n" Zee.Foo.x 
*) 

let() = 
    printf "%d\n" Zee.bar 

Полный выход из corebuild с кодом точно, как описано выше:

bash# rm -rf _build && corebuild xx.byte 
ocamlfind ocamldep -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -modules xx.ml > xx.ml.depends 
ocamlfind ocamldep -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -modules zee.mli > zee.mli.depends 
ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -annot -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o zee.cmi zee.mli 
ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -annot -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o xx.cmo xx.ml 
ocamlfind ocamldep -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -modules zee.ml > zee.ml.depends 
ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -annot -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o zee.cmo zee.ml 
+ ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -annot -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o zee.cmo zee.ml 
File "zee.ml", line 1: 
Error: The implementation zee.ml does not match the interface zee.cmi: 
     The field `Foo' is required but not provided 
Command exited with code 2. 

ответ

5

Это потому, что вы сказали

module type Foo = 
sig 
    val x : int 
end 

пока вы имели в виду

module Foo : 
sig 
    val x : int 
end 

Первое утверждение Объявляет тип модуляFoo и определяет (обратите внимание на использовании = знака, напоминающего связывающим) подписи для данного типа модуля. Затем тип модуля можно использовать для specify the expected signature of arguments to a functor или до filter the signature of a module implementing a superset of Foo.

Второй оператор объявляет модуляFoo и указать (обратите внимание на использовании : характера, напоминающего типа ограничения) подпись данного модуля.

File "zee.ml", line 1: 
Error: The implementation zee.ml does not match the interface zee.cmi: 
     The field `Foo' is required but not provided 

Это потому, что вы обещали тип модульFoo в файле интерфейса, который вы не реализовать в файле реализации - вместо того, чтобы вы реализовали модуль с этим интерфейсом.

File "xx.ml", line 3, characters 23-32: 
Error: Unbound module Zee.Foo 

Это происходит потому, что модуль определение скрыт файл интерфейса.

+0

Спасибо за указание отличия. Теперь я понимаю, почему у меня были проблемы в моем более крупном проекте. – bstpierre

Смежные вопросы