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

List 在OCaml中,为什么列表构造函数::不是运算符,list,constructor,ocaml,List,Constructor,Ocaml,今天我在读Jason Hickey的在线书《目标Caml简介》,在关于函子的章节(第140页)中,我在集合函子的定义中遇到了以下几行: let add = (::) 运行代码会产生一条不太明显的“语法错误”错误消息。在将插件插入ocaml顶级之后,我发现:实际上不是一个操作符,而是一个类型构造函数 然而,据我对Haskell所知甚少,等价的:构造函数也可以被视为运算符(函数) 我的问题是:OCaml构造函数是否从来都不是第一类值(这意味着书中的代码从一开始就是错误的),为什么会是这种情况?在O

今天我在读Jason Hickey的在线书《目标Caml简介》,在关于函子的章节(第140页)中,我在集合函子的定义中遇到了以下几行:

let add = (::)
运行代码会产生一条不太明显的“语法错误”错误消息。在将插件插入ocaml顶级之后,我发现
实际上不是一个操作符,而是一个类型构造函数

然而,据我对Haskell所知甚少,等价的
构造函数也可以被视为运算符(函数)


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

在OCaml的前身Caml Light中,过去的情况是,构造函数在部分应用时升级为函数。我不太清楚为什么在迁移到OCaml时删除了这个特性,我也对此表示遗憾,但我听到的解释是“没有人使用它”。所以不再有
List.map一些foo


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

我通常使用
(fun x y->x::y)
来解决这个问题(将运算符转换为lambda)。这有点烦人,但很管用。另外,即使
::
是一个函数,当你需要交换
::
的参数时,你仍然需要做同样的事情,所以我想这在这方面是有意义的。我不记得听过“没人用过”的解释。我认为其动机是强调函数和构造函数之间的区别……这很有趣。我同时阅读使用Caml Light的“函数编程方法”,并在几个地方发现该语言比OCaml更好(默认模式匹配用于乐趣定义,让表单和内置函数组合操作符进入),Xavier 10多年前回答:@camlsportnice find!为了纠正我之前的评论,《编程的函数方法》一书使用了CAML,而不是我错误地说的CAML-Light。
Prelude> :t (:)
(:) :: a -> [a] -> [a]