OCaml是否具有多态性?

Suz*_*ioc 4 oop polymorphism ocaml strong-typing

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

sep*_*p2k 10

是的,OCaml具有多态性.以下是算术运算未实现为多态方法的一些原因:

  1. 整数和双精度不是OCaml中的对象,因此它们不能有方法.
  2. OCaml中的运算符是函数,而不是方法.当然,语言本来可以设计为使它们成为方法,但是你不能为任何不是对象的东西定义自定义操作符.
  3. 如果你编写一个类似f (x, y) = x + y推断类型的函数int * int -> int.如果您更改语言以生成运算符方法和ints对象,则推断类型将是< + : 'a -> 'b; .. > * 'a -> 'b.对于这种简单的功能具有这种复杂的类型可能是不希望的.
  4. 每次使用算术运算时支付多态分派的成本都会对性能造成不利影响.

还要注意,在许多支持运算符重载的主流语言中,运算符往往被实现为非虚拟(因而非多态)方法或函数.大概是因为我上面提到的表现原因.拥有多态运算符是相当罕见的.

PS:在函数式语言的上下文中,术语"多态性"最常用于表示"参数多态"(OO语言有时称为"泛型"),而在OO语言中,它最常用于表示"子类型多态性" ".这个答案假定你使用了单词的后一个含义,因为你明确提到了面向对象,因为前一个含义在这个上下文中并没有真正意义.