【发布时间】:2012-07-29 00:06:45
【问题描述】:
我在处理 ocaml 项目时发现了一些我不太了解的东西。
假设我同时使用 OCaml 标准库的 Array 和 List 模块。它们都实现了函数length,但类型不同。
在List 模块中,这是它的类型:
length: a' list -> int
在Array 模块中,它的类型为:
length: a' array -> int
但是我希望你通过 open 关键字在我正在实现的同一个模块中使用这两个模块:
open List
open Array
当我尝试在列表中使用length 函数时,在编译过程中出现类型错误。
由于 OCaml 是一种强大的静态类型语言,我想知道为什么编译器不知道我想要 list 模块的 length 函数,因为我声明我同时使用了这两个模块。
【问题讨论】:
-
“我想知道为什么编译器不知道我想要 list 模块的长度函数,因为我声明我同时使用两者”是的,但是
fun s -> length s的类型是什么那么这个上下文呢? -
根据 jrouquie 的回答,应该是
a' array -> int -
没错,但是在假设的 OCaml 编译器试图猜测的情况下,在 OCaml 类型系统中不会有一个最通用的函数类型。你可能对 Haskell 的解决方案感兴趣,输入类:haskell.org/tutorial/classes.html
-
@PascalCuoq:你可以用函子和模块类型做 Haskell 在 OCaml 中所做的事情,除了你必须手动指定类型类的实例而不是被推断
标签: types module namespaces ocaml