我注意到OCaml语法异常丰富,以不同的方式表达看似相同的结构。例如,有多种方法可以终止OCaml中的表达式,例如;;
,;
,in
,,
,有时甚至根本没有终止符。括号也有许多种,显然可以互换,例如()
,{}
和[]
。
为什么在OCaml中有这么多语法结构,并且有一个很好的摘要来突出这些结构之间的差异?
答案 0 :(得分:3)
OCaml中有零个表达式终止符。我认为这不是太多:)
让我们看一下您认为终结者的例子。
;;
并不是OCaml语法的一部分。它确实是一个终结器,它在交互式顶层中用于发送代码块以供执行。为了兼容性,OCaml代码中允许使用此符号,但通常不应使用它。即使在顶层,您通常也使用一些快捷方式,例如Emacs中的Shift-Enter
,它将为您发送代码。
;
用作不同集合文字(例如,列表,数组等)中的分隔符。它还用于链接两个副作用表达式,例如print_int 1; print_int 2
是一个表达式,该方法首先计算print_int 1
并忽略其结果,然后计算print_int 2
也忽略其结果。
in
用于let <var> = <expr> in <body>
表达式的中间,该表达式构成一个表达式<body
>,其中<var>
a的所有出现都被{{1 }},例如
<expr>
与let x = 2 in x * x
相同。
不同的括号用于定义不同类型的集合,例如
2 * 2
-定义一个元组("42",42,'42')
-一个符号链接的单态列表[1;2;3;4]
-固定大小的数组[| 1;2;3;4 |]
-一条记录(它是具有命名字段的元组)总体而言,OCaml是一种非常丰富的语言,具有许多功能。该语言的主要功能之一是自动类型推断,其中表达式的类型是自动推断的(程序员没有任何注释)。因此,代码应该是自描述的,因为与其他类型的语言(其中键入上下文定义了语法构造的语义)不同,在OCaml中是相反的-语法构造定义了语义,因此定义了类型。例如,在没有自动类型推断的语言中,可以对不同类型的文字使用相同的语法(参见C中的初始化列表),因为定义上下文定义了实际使用的特定类型。相反,在OCaml中,文字本身应定义恢复其类型所必需的上下文。作为一个很好的副作用,OCaml语法非常明确,以至于正在阅读它的人始终可以轻松地手动推断类型并理解代码的语义,而无需查看其他地方。
说了这么多,一般来说,学习OCaml语法和OCaml非常容易,因为它定义明确,没有任何黑角或多种解释。它是通过设计制成的。 books众多,可帮助您学习OCaml以及其他learning resources。到最后,您将开始认为这是其他具有奇怪语法的语言:)
关于它们在一个地方的比较,有一个地方-叫做OCaml手册,它正式,准确地描述了每个符号的含义。 Chapter 7有点简洁和正式,因此我建议在前6个之后阅读。但是它实际上包含了EBNF式表示法中的所有内容,例如,这里是expression语法。
最后,如果您真的不能使用OCaml语法,则可以使用Reason,这是OCaml,其语法对于具有Javascript或C背景的人来说看起来更常规。