【问题标题】:OCaml syntax trap: multiple lets using separatorsOCaml 语法陷阱:多个让使用分隔符
【发布时间】:2014-08-06 10:59:42
【问题描述】:

我正在尝试自学 OCaml。我一直在为这个语法陷阱发疯。有人告诉我,您可以使用“;”将表达式按顺序串在一起。即 expr1 ; expr2 按预期执行第一个 expr,然后是第二个。出于某种原因,我无法让口译员同意以下输入

let x = 5 ; let y = 7;;

奇怪的是,如果只有第一个 expr 是一个 let,它就可以工作。所以

let x = 5 ; 7;;

通过,评估为 7。 更糟糕的是,如果我尝试使用括号组合多个语句序列,其中 let 先出现,它仍然不起作用。即:

let x = 5 ; (let y = 7 ; 9);;

是一个错误,即使它只包含 let 是第一个表达式的序列。有人能解释一下如何让它工作吗?

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    查看问题的一种方法是let x = 5 不是表达式。这是一个顶级声明;即,它声明了一个名称x,其值为5。

    ; 运算符适用于组合表达式,但不适用于声明。

    您不需要将声明与; 连在一起。您可以一个接一个地放置:

    # let x = 5 let y = 7;;
    val x : int = 5
    val y : int = 7
    # 
    

    在 OCaml 中有一个完全不同let 用法,它是表达式的一部分。在这种情况下,后面跟着in:

    # (let x = 4 in x + 1);;
    - : int = 5
    

    由于这是一个表达式,您可以将其中几个与; 串在一起:

    # (let x = 4 in x + 1); (let y = 6 in y + 1);;
    Warning 10: this expression should have type unit.
    - : int = 7
    

    但是,正如编译器警告您的那样,将任意表达式串在一起并不习惯。通常,您将; 与命令式代码一起使用。使用功能代码没有意义。所以编译器期望除最后一个表达式之外的所有表达式都具有unit 类型(用于执行一些有用但不返回有用值的命令式代码)。

    【讨论】:

    • 明白!谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多