【发布时间】:2014-11-03 23:36:49
【问题描述】:
如果我有以下 OCaml 函数:
let myFun = CCVector.map ((+) 1);;
它在 Utop 中运行良好,而且 Merlin 没有将其标记为编译错误。但是,当我尝试编译它时,出现以下错误:
错误:这个表达式的类型, (int, '_a) CCVector.t -> (int, '_b) CCVector.t, 包含无法泛化的类型变量
如果我对它进行 eta 扩展,那么它编译得很好:
let myFun foo = CCVector.map ((+) 1) foo;;
所以我想知道为什么它不能以 eta-reduced 形式编译,以及为什么 eta-reduced 形式似乎在顶层(Utop)中工作,但在编译时却不行?
哦,CCVector 的文档是here。 '_a 部分可以是 `RO 或 `RW,这取决于它是只读的还是可变的。
【问题讨论】:
-
我注意到你已经在上面添加了
haskell标签。尽管 Haskell 具有“可怕的单态性限制”,乍一看其行为与 Ocaml 的值限制模糊地相似,但这两种限制的原因非常不同。 Ocaml 使用它来驯服副作用,但 Haskell 是纯的,所以不需要它。 Haskell 的限制可以防止对值进行意外的重新评估,而且这并非绝对必要 - 对于某些类型的代码,它更烦人而不是有用,并且有一个流行的选项可以将其关闭。 -
它们比你第一眼看到的更相似。
标签: haskell functional-programming ocaml