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

标签 list constructor ocaml

我今天正在阅读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/

相关文章:

c++ - 未调用 std::function 移动构造函数

java - setter 方法和构造函数方法有什么区别?

ocaml - 绘图自动机的工具

java - Selenium (Java) - 根据其他属性获取列表 id

python - 使用列表项的 "existence"作为 Python 的 if 条件语句

java - 使用自定义比较器排序列表不起作用

ocaml - 循环依赖reasonml

python - a.insert(0,x) 是一个 o(n) 函数吗? a.append 是一个 O(1) 函数吗? Python

c++ - 为什么包含常量数据成员的类不存在默认构造函数

ocaml - 在 OPAM 中切换环境