【问题标题】:Why this OCaml syntax error为什么这个 OCaml 语法错误
【发布时间】:2018-06-28 17:46:00
【问题描述】:

我在 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 *)

语法错误消失了。

谁能解释语法错误的原因,以及这两个更正中的每一个都做了什么来解决它?

【问题讨论】:

    标签: syntax-error ocaml


    【解决方案1】:

    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

    【讨论】:

    • 您的意思是let tripple ... 是一个表达式,需要以;; 终止才能成为顶级声明?如果是这样,为什么 let double ... 不需要 ;; 终止符被视为顶级?
    • 对不起,我想我有点混淆了。 let tripple = ... 不是表达式,而是 = 之后的表达式。因此,如果不能将 let s ... 明确地解释为顶级声明,则将其解析为好像它是前面表达式的一部分。如果您将let s ... 替换为像"hello" 这样的简单表达式,可能会更简单,其中将被解析为将参数应用于函数x
    • 这有点混乱,因为我认为省略 ;; 终止符有点事后诸葛亮,但经验法则是:如果顶级声明之后的内容本身不是顶级声明,你需要用;;分隔它们。
    • 或者您可以将let s = ... 转换为顶级声明:let () = let s = "Hello" in print_endline s
    • 我喜欢这两条规则:1) "if what follows a top level declaration is not itself a top level declaration, you need to separate them with ;;" 和 2) "if let s ... can't unambiguously be interpreted as a top level declaration, it's parsed as if it is part of the preceding expression"。我会记住这两个,看看情况如何。谢谢。
    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 2018-08-26
    • 2015-02-11
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多