我在Ocaml中有这段代码
let double x = 2 * x
let triple x = 3 * x
let s = "Hello" in print_endline s
let () = triple 10 |> string_of_int |> print_endline
并且在使用ocamlc file.ml
进行编译时会出现错误:
File "file.ml", line 5, characters 16-18:
Error: Syntax error
如果我将;;
放在第3行的末尾,就像这样
let triple x = 3 * x;;
如果我像第5行那样评论第5行中的字符16-18
let s = "Hello" (* in print_endline s *)
语法错误消失了。
有人可以解释语法错误的原因,以及这两个更正中的每一个都可以解决它吗?
答案 0 :(得分:5)
let s = "Hello" in print_endline s
即使以let
开头也不是顶级声明,它是let .. in
表达式。如果你没有用;;
终止前面的表达式,那么它期望下一个表达式成为该表达式的一部分而不是将其解释为顶级声明。
如果您删除in ...
部分,则会将其从let ... in
表达式更改为顶级let
声明。
你也可以把它变成这样的顶级声明:
let () = let s = "Hello" in print_endline s
编辑:
考虑这一点的一种方法是,而不是
let triple x = 3 * x
let s = "Hello" in print_endline s
您使用更简单的表达式let s = ... in ...
替换"Hello"
:
let triple x = 3 * x
"Hello"
这相当于
let triple x = 3 * x "Hello"
将解析为将参数"Hello"
应用于函数x