在OCaml中,为什么列表构造函数::不是运算符

时间:2012-12-12 16:27:15

标签: list constructor ocaml

我今天正在阅读Jason Hickey的在线书籍“Objective of Caml”和在Functors一章(第140页)中,我在Set functor的定义中遇到了以下几行:

let add = (::)

运行代码导致了一个不太明显的“语法错误”错误消息。在插入ocaml toplevel的行后,我发现::实际上不是运算符,而是类型构造函数。

但是,从我对Haskell的了解很少,等效的:构造函数也可以被视为运算符(函数)。

Prelude> :t (:)
(:) :: a -> [a] -> [a]

我的问题是:OCaml构造函数从来都不是第一类值(意味着本书中的代码从一开始就是错误的),为什么会出现这种情况?

1 个答案:

答案 0 :(得分:12)

在OCaml的前身Caml Light中,曾经是构造函数在部分应用时被提升为函数的情况。我不太清楚为什么在移动到OCaml时移除了这个功能,我也感激不尽,但我听到的解释是“没人用过”。所以不再List.map Some foo ......

::作为代数数据类型构造函数有点特殊,因为它是唯一的中缀构造函数(在解析器中硬编码),但其他行为与任何其他数据类型构造函数一样。