5

ocaml我在做一个项目时发现了一些我不太了解的东西。

假设我同时使用 OCaml 标准库的ArrayList模块。它们都实现了该功能length,但具有不同的类型。在List模块中,这是它的类型:

length: a' list -> int

Array模块中,它具有以下类型:

length: a' array -> int

open但后来我希望你通过关键字在我正在实现的同一个模块中使用这两个模块:

open List
open Array

当我尝试length在列表中使用该函数时,在编译过程中出现类型错误。
由于 OCaml 是一种强大的静态类型语言,我想知道为什么编译器不知道我想要 list 模块的长度函数,因为我声明我同时使用两者。

4

1 回答 1

8

OCaml 不会根据它们的类型选择一个或另一个函数。

当你写

open Array

模块的功能Array是屏蔽List同名模块的功能。当您稍后调用 functionlength时,OCaml 会查找名为 的函数length,找到Array.length并抱怨该函数没有兼容的类型。

如果那是您需要的功能,通常的方法是调用List.length(而不仅仅是)。length


更一般地说,OCaml 没有名称重载(即有两个具有相同名称但参数类型不同的函数或运算符),特别是因为这会使类型推断更加困难。

于 2012-07-31T09:02:11.867 回答