我在测试文件中使用模块时遇到问题。我在这里创建了一个更简单的版本,仍然可以复制问题。
(* person.ml *)
module Person = struct
type person = {name: string; age: int}
let create_person name age = {name=name; age=age}
end
(*makefile *)
test:
ocamlbuild -pkgs oUnit,yojson,str,ANSITerminal test.byte && ./test.byte
check:
bash checkenv.sh
clean:
ocamlbuild -clean
(* test.ml *)
open OUnit2
open Person
let person = create_person "john" 40
(* utop *)
#use "person.ml"
open Person
let person = create_person "john" 40
Output: val person : person = {name = "john"; age = 40}
(* when I type in "make" in the terminal *)
ocamlbuild -pkg oUnit test.byte && ./test.byte
+ /Users/user/.opam/4.03.0/bin/ocamlc.opt -c -I /Users/user/.opam/4.03.0/lib/oUnit -I /Users/user/.opam/4.03.0/lib/ocaml -o test.cmo test.ml
File "test.ml", line 4, characters 13-26:
Error: Unbound value create_person
Command exited with code 2.
Hint: Recursive traversal of subdirectories was not enabled for this build,
as the working directory does not look like an ocamlbuild project (no
'_tags' or 'myocamlbuild.ml' file). If you have modules in subdirectories,
you should add the option "-r" or create an empty '_tags' file.
To enable recursive traversal for some subdirectories only, you can use the
following '_tags' file:
true: -traverse
<dir1> or <dir2>: traverse
Compilation unsuccessful after building 4 targets (2 cached) in 00:00:00.
make: *** [test] Error 10
答案 0 :(得分:2)
问题来自于person_create可以通过Person.create_person访问,而不是person_create。在ocaml中,文件已经是一个模块。因此,当您打开Person时,您打开文件名为person.ml的模块。在该模块中,您将创建一个名为Person的模块,您可以在其中定义person_create。因此,要么删除文件中的Person模块,要么键入&#34; Person.create_person&#34;而不是create_person 当你在utop中测试时:#use指令就像一个include。所以你丢失了文件名,打开Person后就可以直接访问person_create。