我今天正在阅读Jason Hickey的在线书籍“Objective of Caml”和在Functors一章(第140页)中,我在Set functor的定义中遇到了以下几行:
let add = (::)
运行代码导致了一个不太明显的“语法错误”错误消息。在插入ocaml toplevel的行后,我发现::
实际上不是运算符,而是类型构造函数。
但是,从我对Haskell的了解很少,等效的:
构造函数也可以被视为运算符(函数)。
Prelude> :t (:)
(:) :: a -> [a] -> [a]
我的问题是:OCaml构造函数从来都不是第一类值(意味着本书中的代码从一开始就是错误的),为什么会出现这种情况?
答案 0 :(得分:12)
在OCaml的前身Caml Light中,曾经是构造函数在部分应用时被提升为函数的情况。我不太清楚为什么在移动到OCaml时移除了这个功能,我也感激不尽,但我听到的解释是“没人用过”。所以不再List.map Some foo
......
::
作为代数数据类型构造函数有点特殊,因为它是唯一的中缀构造函数(在解析器中硬编码),但其他行为与任何其他数据类型构造函数一样。