Oop OCaml是否具有多态性?
既然OCaml有不同的整数相乘和双精度相乘操作,它怎么能是面向对象的呢?这不意味着OCaml没有多态性吗?是的,OCaml有多态性。以下是算术运算没有作为多态方法实现的一些原因:Oop OCaml是否具有多态性?,oop,polymorphism,ocaml,strong-typing,Oop,Polymorphism,Ocaml,Strong Typing,既然OCaml有不同的整数相乘和双精度相乘操作,它怎么能是面向对象的呢?这不意味着OCaml没有多态性吗?是的,OCaml有多态性。以下是算术运算没有作为多态方法实现的一些原因: 整数和double在OCaml中不是对象,因此它们不能有方法 OCaml中的运算符是函数,而不是方法。当然,该语言本来可以设计为使它们成为方法,但是您不能为任何非对象的对象定义自定义运算符 如果编写一个函数,如f(x,y)=x+y,则推断的类型为int*int->int。如果将语言更改为使运算符成为方法和ints对象,
f(x,y)=x+y
,则推断的类型为int*int->int
。如果将语言更改为使运算符成为方法和ints对象,则推断的类型将是<+:'a->'b;。>*'a->'b
。对于如此简单的函数,使用如此复杂的类型可能是不可取的PS:在函数语言的上下文中,“多态性”一词最常用于指“参数多态性”(OO语言有时称之为“泛型”),而在OO语言中,它最常用于指“子类型多态性”。这个答案假设您使用了单词的后一种含义,因为您明确提到了面向对象,而且前一种含义在这种情况下没有真正意义。正如sepp2k所提到的,如果您想更好地理解这些东西,可以免费下载。这可能会有所帮助。OCaml中的函数不是多态的吗?它们在C++中是多态的。@ SuzanCioc,你们在这里讨论什么类型的多态性?正如我所说,在OO编程的上下文中,“多态性”通常指子类型多态性,即系统根据对象的运行时类型决定调用哪个函数/方法的属性。C++中的自由函数(或非虚拟方法)不具有子类型多态性,即函数/方法将被调用的决定完全发生在编译时。如果您指的是过载函数的能力(有时称之为“ad-hoc多态性”)。虽然我个人没有听说过这个词经常使用:是的,你可以在C++中重载函数(虽然注意到这里将选择的函数在编译时完全确定),而且,你不能在OCAML中重载函数。OCaml不允许重载的一个原因是该特性不能很好地处理类型推断。我认为多态性与绑定时间无关。如果我可以为不同的类型使用一种形式,那么它就是它,无论何时绑定发生。@SuzanCioc子类型多态性与绑定时间密切相关。如果你在谈论一种不同类型的多态性,请明确地说出来。