我无法编译一个非常简单的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 ...”但它们不能共存!
答案 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
,这总是很好。