10

我今天正在阅读 Jason Hickey 的在线书籍“Objective Caml 简介”,在关于 Functor 的章节(第 140 页)中,我在 Set functor 的定义中遇到了以下行:

let add = (::)

运行代码会导致一条不太明显的“语法错误”错误消息。在将行中的插件插入 ocaml 顶层之后,我发现这::实际上不是运算符,而是类型构造函数。

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

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

我的问题是:OCaml 构造函数从来都不是一流的值(暗示书中的代码从一开始就是错误的),为什么会这样?

4

1 回答 1

13

在 OCaml 的前身 Caml Light 中,过去构造函数在部分应用时被提升为函数的情况。我不确定为什么在迁移到 OCaml 时会删除此功能,我也对此感到遗憾,但我听到的解释是“没有人使用它”。所以没有List.map Some foo了……

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

于 2012-12-12T16:57:13.593 回答