代码之家  ›  专栏  ›  技术社区  ›  mljrg

为什么会出现此OCaml语法错误

  •  2
  • mljrg  · 技术社区  · 7 年前

    我在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行中的字符16-18

    let s = "Hello" (* in print_endline s *)
    

    语法错误消失了。

    有人能解释一下语法错误的原因吗?这两个更正都是如何解决的?

    1 回复  |  直到 7 年前
        1
  •  5
  •   glennsl Namudon'tdie    7 年前

    let s = "Hello" in print_endline s 不是顶级声明,即使它以 let ,它是 let .. in 表示如果不以终止前面的表达式 ;; 它希望接下来的内容是该表达式的一部分,而不是将其解释为顶级声明。

    如果删除 in ... 您正在将其从 let ... in 顶级表达式 允许 公告

    您还可以将其转换为如下顶级声明:

    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"
    

    将解析为应用参数 “你好” 到函数 x