由于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 –