由於OCaml對於整數和雙精度乘法有不同的操作,它如何能夠面向對象?這是不是意味着OCaml沒有多態性?OCaml是否具有多態性?
回答
是的,OCaml具有多態性。下面是爲什麼算術運算沒有實現爲多態方法的一些原因:
- 整數和雙打不是OCaml中的對象,所以它們不能有方法。
- OCaml中的運算符是函數,而不是方法。當然,語言本來可以設計成讓它們成爲方法,但是不能爲任何不是對象的東西定義自定義運算符。
- 如果您編寫的功能類似
f (x, y) = x + y
,則推斷類型爲int * int -> int
。如果您更改語言以使操作符方法和裝入對象,則推斷的類型將爲< + : 'a -> 'b; .. > * 'a -> 'b
。對於這樣一個簡單的功能來說,有這樣一個複雜的類型可能不是理想的。 - 每次使用算術運算時支付多態調度的代價會對性能造成影響。
另請注意,在許多支持運算符重載的主流語言中,運算符往往被實現爲非虛擬(因此也是非多形)方法或函數。大概是出於我上面提到的性能原因。具有多態操作符並不常見。 PS:在功能語言的語境中,術語「多態性」最常用於指代「參數多態性」(OO語言有時稱爲「泛型」),而在OO語言中它最常用於引用到「亞型多態性」。這個答案假定你使用了這個詞的後一個意思,因爲你明確提到了面向對象,因爲前面的意思在這個上下文中沒有意義。
OCaml中的函數不是多態嗎?即使在C++中它們也是多態的。 –
@SuzanCioc你在說什麼類型的多態?正如我所說的,在面向對象編程的背景下,「多態性」通常指的是子類型多態,即系統根據對象的運行時類型決定調用哪個函數/方法的屬性。 C++中的免費函數(或者非虛擬方法)不會表現出子類型多態,也就是決定哪個函數/方法會在編譯時被完全調用。 – sepp2k
如果你指的是重載函數的能力(有時候被稱爲「ad-hoc多態性」 - 雖然我個人並沒有經常聽到這個詞的用法):是的,你可以在C++中重載函數(儘管請注意,在這裏選擇哪個函數完全是在編譯時確定的),否則,不能在OCaml中重載函數。 OCaml不允許超載的一個原因是該功能在類型推斷中表現不佳。 – sepp2k
- 1. 具有多態性資源
- 2. PHP中是否有任何多態性?
- 3. OCaml是否有popcnt功能?
- 4. 檢查屬性是否具有屬性
- 5. C#:具有非多態類的動態多態性
- 6. 使基類具有多態性?
- 7. MVVM - 具有多態性的集合
- 8. ServiceStack ormlite是否具有瞬態屬性的概念?
- 9. OCaml的讓多態實現
- 10. NumPy是否具有均勻性功能?
- 11. 檢查屬性是否具有DisplayNameAttribute
- 12. 是否有任何VB6性能工具?
- 13. 對象是否具有屬性
- 14. sscanf是否具有破壞性?
- 15. 檢查對象是否具有屬性
- 16. @JoinTable是否具有「table」屬性?
- 17. select()行爲是否具有可寫性?
- 18. 多列列表是否具有單獨的彈性列?
- 19. ER圖 - 關係是否具有多值屬性?
- 20. OCaml - 操作是否高效?
- 21. TypeRex是否支持OCaml 4.00.1?
- 22. Rails:多態性與否?
- 23. 是否有可能在.net 4.0中具有動態對象屬性
- 24. 具有多態性的嵌套屬性has_many模型
- 25. 柯里函數取消OCaml中的多態性?
- 26. OCaml中的多態性 - 特設,參數化,包含/子類型
- 27. OCaml的仿函數取多態性變異型
- 28. OCaml的:更高kinded多態性(抽象化了的模塊?)
- 29. OCaml多態性示例以外的模板函數?
- 30. 爲什麼AbstractFactoryUnit具有動態而不是靜態多態?
由於sepp2k提到有不同種類的多態性,如果你想更好地理解這些東西是建議[本文](http://dx.doi.org/10.1145/6041.6042)可以自由下載[這裏]( http://research.microsoft.com/pubs/67509/onunderstanding.a4.pdf)。 –
這可能有助於http://fdatamining.blogspot.com/2012/12/a-reading-list-on-languages-in-ml-family.html –