2013-01-20 37 views
4

由于OCaml对于整数和双精度乘法有不同的操作,它如何能够面向对象?这是不是意味着OCaml没有多态性?OCaml是否具有多态性?

+2

由于sepp2k提到有不同种类的多态性,如果你想更好地理解这些东西是建议[本文](http://dx.doi.org/10.1145/6041.6042)可以自由下载[这里]( http://research.microsoft.com/pubs/67509/onunderstanding.a4.pdf)。 –

+0

这可能有助于http://fdatamining.blogspot.com/2012/12/a-reading-list-on-languages-in-ml-family.html –

回答

10

是的,OCaml具有多态性。下面是为什么算术运算没有实现为多态方法的一些原因:

  1. 整数和双打不是OCaml中的对象,所以它们不能有方法。
  2. OCaml中的运算符是函数,而不是方法。当然,语言本来可以设计成让它们成为方法,但是不能为任何不是对象的东西定义自定义运算符。
  3. 如果您编写的功能类似f (x, y) = x + y,则推断类型为int * int -> int。如果您更改语言以使操作符方法和装入对象,则推断的类型将为< + : 'a -> 'b; .. > * 'a -> 'b。对于这样一个简单的功能来说,有这样一个复杂的类型可能不是理想的。
  4. 每次使用算术运算时支付多态调度的代价会对性能造成影响。

另请注意,在许多支持运算符重载的主流语言中,运算符往往被实现为非虚拟(因此也是非多形)方法或函数。大概是出于我上面提到的性能原因。具有多态操作符并不常见。 PS:在功能语言的语境中,术语“多态性”最常用于指代“参数多态性”(OO语言有时称为“泛型”),而在OO语言中它最常用于引用到“亚型多态性”。这个答案假定你使用了这个词的后一个意思,因为你明确提到了面向对象,因为前面的意思在这个上下文中没有意义。

+0

OCaml中的函数不是多态吗?即使在C++中它们也是多态的。 –

+0

@SuzanCioc你在说什么类型的多态?正如我所说的,在面向对象编程的背景下,“多态性”通常指的是子类型多态,即系统根据对象的运行时类型决定调用哪个函数/方法的属性。 C++中的免费函数(或者非虚拟方法)不会表现出子类型多态,也就是决定哪个函数/方法会在编译时被完全调用。 – sepp2k

+0

如果你指的是重载函数的能力(有时候被称为“ad-hoc多态性” - 虽然我个人并没有经常听到这个词的用法):是的,你可以在C++中重载函数(尽管请注意,在这里选择哪个函数完全是在编译时确定的),否则,不能在OCaml中重载函数。 OCaml不允许超载的一个原因是该功能在类型推断中表现不佳。 – sepp2k