2013-01-20 42 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