我今天正在阅读Jason Hickey的在线书“Objective Caml简介”,并且在有关仿函数的章节(第140页)中,我遇到了Set仿函数定义内的以下行:
let add = (::)
运行代码会导致显示不很“语法错误”的错误消息。将插件插入ocaml顶层之后,我发现
::
实际上不是运算符,而是类型构造函数。但是,从我对Haskell所知甚少,等效的
:
构造函数也可以视为运算符(函数)。Prelude> :t (:)
(:) :: a -> [a] -> [a]
我的问题是:OCaml构造函数从来不是一流的值吗(这暗示本书中的代码从一开始就是错误的),为什么会这样呢?
最佳答案
在OCaml的前身Caml Light中,曾经是构造函数在部分应用时提升为函数的情况。我不确定为什么在移至OCaml时会删除此功能,我也对此表示遗憾,但是我听到的解释是“没人使用过”。所以不再有List.map Some foo
了...::
作为代数数据类型构造函数有点特殊,因为它是唯一的infix构造函数(在解析器中进行了硬编码),但在其他方面却表现得与其他任何数据类型构造函数一样。
关于list - 在OCaml中,为什么列表构造函数::不是运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844151/