OCaml多态性的例子,而不是模板函数
OCaml polymorphism example other than template function?
我想自己理解一下,OCaml语言有哪种形式的多态。
我是由一个例子提供的
let id x = x
这个例子是不是等价于c++的模板函数
template<class A> A id(A x) { return x; }
如果是这样,那么我的问题是:在OCaml中有任何其他形式的多态性吗?这个概念在命令式语言的世界里被称为"泛型算法",而不是"多态性"。
基本上有三种语言特性有时被称为多态性:
- 参数多态性(即"仿制药")
- 子类型多态性,这是类型的子类型提供比超类型更具体的操作版本的能力,即覆盖方法的能力(以及运行时系统根据对象的运行时类型调用方法的正确实现的能力)。在OO语言中,这通常被简单地称为"多态性"。
- 所谓的ad-hoc多态性,即能够重载函数/方法。
正如您已经发现的,OCaml具有参数多态性。它还具有亚型多态性。它没有ad-hoc多态性。
既然在你的标题你已经要求的例子,这里是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
这种多态称为泛型编程,但其背后的理论概念称为参数多态。
你提供的两个例子确实显示了参数多态性,但是OCaml是由一个强推断类型检查器支持的,而不是由c++提供的(这是一个更实用的解决方案,有更多的警告),所以真正的区别是,在c++中,代码对于你在代码中使用的每种类型都是重复的,而在OCaml中,它是由类型检查器通过验证通过统一替代隐式类型变量来解决的。
在OCaml中,任何东西都可以是多态的,因为通常没有类型注释,所以在实践中,如果某些东西可以用作任何函数的参数,那么它是隐式允许的。
例如,您可以使用类型变量来定义多态方法:
let swap ((x : 'a), (y : 'b)) : 'b * 'a = (y, x)
这样无论'a
或'b
是什么类型都可以工作
相关文章:
- 从基类调用函数的多态性
- C++多态性:有没有办法找到对象成员函数的地址?
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 多态性在 lambda 函数C++不起作用
- 多态性是否适用于值?或者在按(基)值返回时使用派生类的移动构造函数
- 如何在保持多态性的同时,将成员函数添加到需要它的继承类中,而不会影响其他同级类?
- C++ 中多态性和函数重载之间的区别
- 函数模板和多态性
- C 多态性实例的构造函数和破坏者
- 多态性(C )的派生类中的超载函数
- 多态性和纯虚函数
- C++ 多态性和非虚函数
- C++多态性/虚拟函数在此不起作用
- 如果重载函数仅被部分重写,则多态性不起作用
- 多态性不适用于相同数据类型(Base和Inherited类)的函数返回值
- 具有引用数据类型的函数多态性
- c++在没有虚拟析构函数的多态性中共享ptr
- 模板函数多态性
- 基类和派生类构造函数多态性问题