【发布时间】:2012-11-30 09:59:38
【问题描述】:
我今天正在阅读 Jason Hickey 的在线书籍“Objective Caml 简介”,在关于 Functors 的章节(第 140 页)中,我在 Set functor 的定义中遇到了以下行:
let add = (::)
运行代码导致了一条不太明显的“语法错误”错误消息。在将行中的插件插入 ocaml 顶层后,我发现 :: 实际上不是运算符,而是类型构造函数。
但是,根据我对 Haskell 的了解,等效的 : 构造函数也可以被视为运算符(函数)。
Prelude> :t (:)
(:) :: a -> [a] -> [a]
我的问题是:OCaml 构造函数从来都不是一流的值(暗示书中的代码从一开始就是错误的),为什么会这样?
【问题讨论】:
-
我通常使用
(fun x y -> x :: y)来解决这个问题(将运算符转换为 lambda)。这有点烦人但有效。此外,即使::是一个函数,当您需要交换::的参数时,您仍然必须这样做,所以我想这在这方面是有道理的。
标签: list constructor ocaml