3

我试图自己理解,OCaml 语言有哪种形式的多态。

我是由一个例子提供的

let id x = x

这个例子不等同于 C++ 模板函数吗

template<class A> A id(A x) { return x; }

如果是这样,那么我的问题是:OCaml 中是否还有其他形式的多态性?这个概念在命令式语言的世界中被称为“通用算法”,而不是“多态性”。

4

2 回答 2

15

基本上有三种语言特性有时被称为多态性:

  • 参数多态性(即“泛型”)
  • 子类型多态性,这是类型的子类型提供比超类型更具体的操作版本的能力,即覆盖方法的能力(以及运行时系统调用基于方法的正确实现的能力)对象的运行时类型)。在 OO 语言中,这通常简称为“多态性”。
  • 所谓的ad-hoc polymorphism,即重载函数/方法的能力。

正如您已经发现的那样,OCaml 具有参数多态性。它还具有亚型多态性。它没有临时多态性。

由于在您的标题中您要求提供示例,因此这是 OCaml 中子类型多态性的示例:

class c = object
    method m x = x+1
end

class d = object
    inherit c
    method m x = x+2
end

let main = 
    let o:c = new d in
    print_int (o#m 2)

这将打印4.

于 2013-01-21T14:42:39.780 回答
4

这种多态称为泛型编程,但其背后的理论概念称为参数多态

您提供的两个示例确实显示了参数多态性,但 OCaml 由一个强大的推断类型检查器支持,而不是由 C++ 提供的那个(这是一种更实用且有更多警告的解决方案)所以真正的区别是在 C++ 中代码是重复的对于您在代码中使用它的每种类型,而在 OCaml 中,它由类型检查器通过验证是否存在通过统一替换隐式类型变量来解决。

在 OCaml 中,一切都可以是多态的,因为通常没有任何东西用类型注释,所以在实践中,如果某些东西可以用作任何函数的参数,那么它是隐式允许的。

例如,您可以使用类型变量来定义多态方法:

let swap ((x : 'a), (y : 'b)) : 'b * 'a = (y, x)

这样这将适用于任何类型的'ao 'b

OCaml 的另一个强大的多态特性是函子(不是常见的 C++ 函子),而是由其他模块参数化的模块。这个概念听起来更可怕,但它们确实代表了 OCaml 代码的更高阶的多态行为。

于 2013-01-21T14:30:34.423 回答