5

既然 OCaml 对整数和双精度数的乘法有不同的操作,那么它怎么可能是面向对象的呢?这不是说 OCaml 没有多态性吗?

4

1 回答 1

10

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

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

另请注意,在许多支持运算符重载的主流语言中,运算符也倾向于以非虚拟(因此非多态)方法或函数的形式实现。大概是出于我上面提到的性能原因。具有多态运算符是相当少见的。

PS:在函数式语言的上下文中,术语“多态性”最常用于指代“参数多态性”(OO 语言有时称为“泛型”),而在 OO 语言中,它最常用于指代“子类型多态性” ”。该答案假定您使用的是该词的后一种含义,因为您明确提到了面向对象,并且前一种含义在这种情况下实际上没有意义。

于 2013-01-20T12:50:59.540 回答