Open Module_name给出了编译器错误

时间:2011-06-27 21:11:44

标签: module compiler-errors ocaml

我无法编译一个非常简单的ocaml程序test2.ml

open Test1

print_string " Hello "

test1.ml只包含1行

type program = string

编译test1.ml:

bash-3.2$ ocamlc test1.ml
bash-3.2$ ls test1.*
test1.cmi   test1.cmo   test1.ml

任何人都知道为什么test1.ml不编译?谢谢。

更多信息。这很奇怪,因为如果我注释掉它的第一行“open ...”OR,test2.ml编译 如果我注释掉它的第3行“print_string ...”但它们不能共存!

1 个答案:

答案 0 :(得分:5)

打印您收到的错误 会有所帮助。作为参考,它是:

File "test2.ml", line 3, characters 0-12:
Error: Syntax error

原因有点复杂。正常语法是将文件作为顶级语句序列,例如类型定义,let(不含in),模块定义/打开/包含等等。

print_string "Hello"之类的表达式从不被视为顶级语句,除非含义完全明确,其中99%的时间涉及将它们与前一个语句和后一个语句分开;;

所以,你可以写下面的内容:

open Test1 ;;
print_string " Hello "

它会起作用。但是,大多数情况下,最好通过将表达式转换为顶级let来保持文件清洁:

open Test1
let () = print_string " Hello "

这样做的好处是确保函数返回unit,这总是很好。