OCaml类型声明和大写字母

时间:2016-09-03 16:55:19

标签: compiler-errors ocaml

在Windows环境中使用ocamlc:

type splitter = {varname:string; count:int; mean:float}

在我编译源代码时工作正常,但是:

type splitter = {Varname:string; count:int; mean:float}

导致编译器抱怨(没有提供太多信息)

File "splitter.ml", line 1, characters 17-24:
Error: Syntax error

与此同时,第二条线与OCaml完美配合。这种行为有充分的理由吗?我没有在网上找到任何东西。

2 个答案:

答案 0 :(得分:4)

传统上,FP语言限制了对某些情况使用大写标识符。这使代码更具可读性,并且实际上强制执行某种编码风格。鉴于FP语言传统上不仅具有丰富的表达子语言,而且还具有丰富的类型子语言,它还使解析更容易(我会假设)。

因此,您无法在OCaml中为记录字段使用大写名称。

要在文档中找到这一点,您可以从Section 6.8中的记录语法定义开始,然后观察字段名称 lowercase-ident in Section 6.3

答案 1 :(得分:2)

有一个原因。 OCaml使用许多不同的命名空间,但在某些情况下,其中两个需要可区分。然后,其中一个是纯粹的大写,另一个纯粹是小写。在这种情况下,请考虑表达式a.b.ca.B.c。前者是记录的字段c,而记录又是记录字段a。后者是记录a的字段c,但(相应记录类型定义和)字段名称c来自模块B. 如果OCaml允许使用混合大小写记录名称,则无法在语法上区分这两个表达式,因此点运算符不能同时用于记录字段和模块部分。然后,需要两个不同的运算符,使语法更加麻烦。