首页 > 解决方案 > 为什么OCaml中有这么多表达式终止符?

问题描述

我注意到 OCaml 语法异常丰富,有不同的方式来表达看似相同的结构。例如,在 OCaml 中有多种终止表达式的方法,例如 , , ;;,;有时根本没有终止符。还有许多不同类型的括号,它们显然是可以互换的,例如,、和。in,(){}[]

为什么 OCaml 中有这么多句法结构,是否有一个很好的总结来突出这些结构之间的差异?

标签: syntaxocaml

解决方案


OCaml 中有零表达式终止符。我不认为这太多了:)

让我们看一下您认为是终结者的示例。

  • ;;实际上并不是 OCaml 语法的一部分。它确实是一个终结器,在交互式顶层中用于发送代码块执行。为了兼容性,OCaml 代码中允许使用此符号,但一般情况下,您不应该使用它。即使在顶层,您通常也会使用一些快捷方式,例如Shift-Enter在 Emacs 中,它会为您发送代码。

  • ;在不同的集合文字(即列表、数组等)中用作分隔符。它还用于链接两个副作用表达式,例如,print_int 1; print_int 2是一个表达式,它首先计算print_int 1并忽略其结果,然后计算print_int 2并忽略其结果结果。

  • in用在表达式的中间let <var> = <expr> in <body>,它构造一个表达式<body> 其中所有出现的<var>a 都用 替换<expr>,例如,

    let x = 2 in x * x
    

    是一样的2 * 2

  • 不同的括号用于定义不同类型的集合,例如,

    • ("42",42,'42')- 定义一个元组
    • [1;2;3;4]- 一个符号链接的单态列表
    • [| 1;2;3;4 |]- 一个固定大小的数组
    • { name = "Joe"; age = 12}- 一条记录(这是一个带有命名字段的元组)

总的来说,OCaml 是一种非常丰富的语言,具有许多特性。该语言的主要特征之一是自动类型推断,其中表达式的类型是自动推断的(无需程序员的任何注释)。因此,代码应该是自描述的,因为与其他语言不同,其中键入上下文定义了句法构造的语义,而在 OCaml 中则相反——句法构造定义了语义,因此也定义了类型。例如,在没有自动类型推断的语言中,可以对不同类型的文字使用相同的语法(参见 C 中的初始化列表),因为定义上下文定义了实际使用的特定类型。相反,在 OCaml 中,文字本身应定义恢复其类型所必需的上下文。作为一个很好的副作用,

综上所述,学习 OCaml 语法和一般的 OCaml 非常容易,因为它定义明确,没有暗角或多种解释。它是设计使然。有很多书籍可以帮助您学习 OCaml,以及其他学习资源。归根结底,您会开始认为这是其他具有奇怪语法的语言 :)

关于它们在一个地方的比较,有这样一个地方——它被称为 OCaml 手册,它正式而准确地描述了每个符号的含义。第7 章有点简洁和正式,所以我建议在前 6 章之后阅读。但它实际上包含了所有类似 EBNF 的符号,例如,这里是表达式语法。

最后,如果你真的无法忍受 OCaml 语法,还有Reason,它是 OCaml 的语法,对于具有 Javascript 或 C 背景的人来说看起来更传统。


推荐阅读