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

Pet*_*dic 9 constructor ocaml list

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

let add = (::)
Run Code Online (Sandbox Code Playgroud)

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

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

Prelude> :t (:)
(:) :: a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

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

gas*_*che 12

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

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

  • Xavier回答十多年前:http://caml.inria.fr/pub/ml-archives/caml-list/2001/08/47db53a4b42529708647c9e81183598b.fr.html (5认同)