Open Module_name给出了编译器错误

zel*_*ell 0 ocaml module compiler-errors

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

open Test1

print_string " Hello "
Run Code Online (Sandbox Code Playgroud)

test1.ml只包含1行

type program = string
Run Code Online (Sandbox Code Playgroud)

并编译test1.ml:

bash-3.2$ ocamlc test1.ml
bash-3.2$ ls test1.*
test1.cmi   test1.cmo   test1.ml
Run Code Online (Sandbox Code Playgroud)

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

更多信息.这很奇怪,因为如果我注释掉它的第一行"open ...",或者如果我注释掉它的第3行"print_string ...",那么test2.ml会编译,但是它们不能共存!

Vic*_*let 5

打印您收到的错误很有帮助.作为参考,它是:

File "test2.ml", line 3, characters 0-12:
Error: Syntax error
Run Code Online (Sandbox Code Playgroud)

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

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

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

open Test1 ;;
print_string " Hello "
Run Code Online (Sandbox Code Playgroud)

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

open Test1
let () = print_string " Hello "
Run Code Online (Sandbox Code Playgroud)

这也有确保函数返回的好处unit,这总是很好.