об основной организации файлов - PullRequest
4 голосов
/ 17 января 2011

в файле testmodule.ml

module TestModule =
struct
  type my_type = MyType1 | MyType2
end

Как я могу использовать TestModule на верхнем уровне?

после "ocamlc -c testmodule.ml" (это сгенерированный testmodule.cmo / cmi)

Я пытался "открыть TestModule", но произошла ошибка "несвязанный модуль TestModule".

        Objective Caml version 3.10.0

# open TestModule;;
Unbound module TestModule

Затем я попытался сделать верхний уровень с этим модулем. но ...

indi@www:~/std/toq$ ocamlmktop -o mytop testmodule.ml
indi@www:~/std/toq$ ./mytop
        Objective Caml version 3.10.0

# TestModule.MyType1;;
Unbound constructor TestModule.MyType1
# open TestModule;;
Unbound module TestModule

Что я могу сделать для использования моего TestModule ???

Ответы [ 3 ]

4 голосов
/ 17 января 2011

Директивы, которые вы можете использовать на верхнем уровне для этого, перечислены в руководстве .

Вы можете попробовать #use "testmodule.ml";; или, альтернативно, #load "testmodule.cmo";; после компиляции вашего модуля.

2 голосов
/ 17 января 2011

Как упомянул huitseeker, вы можете использовать #use "testmodule.ml";;. Однако это сделает модуль Testmodule доступным, а ваш TestModule модуль на самом деле будет Testmodule.TestModule. Файлы .cmo (сгенерированные из файлов .ml) определяют модуль, имя которого является именем CMO с заглавной буквой. Поэтому я бы пропустил часть вашего кода module TestModule ... и просто поместил ваш код в файл с именем testModule.ml. Затем вы можете скомпилировать его и использовать #use "testModule.ml";; для доступа к модулю.

0 голосов
/ 22 января 2011

Подводя итог: несколько мелких деталей, которые все вместе сговорились против вас: -)

Во-первых, как упоминалось ранее, вам нужно загрузить код на верхний уровень либо с #use "testmodule.ml";; для исходных файлов, либо с #load "testmodule.cmo";; для скомпилированных файлов или использовать ocamlmktop.Это объясняет, почему ваша первая попытка не сработала: вы не загрузили код.

Во-вторых, вы определили module TestModule в файле с именем testmodule.ml.Имейте в виду, что файл определяет свой собственный модуль на основе своего имени.Итак, чтобы получить доступ к вашему модулю, вам нужно написать Testmodule.TestModule.Это объясняет, почему ваша вторая попытка не сработала: код был загружен, но имел неожиданное имя.

Возможно, вы захотите удалить определение TestModule и переименовать файл в testModule.ml (или, возможно, более идиоматическийtest_module.ml).

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