Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop OCaml是否具有多态性?_Oop_Polymorphism_Ocaml_Strong Typing - Fatal编程技术网

Oop 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对象,

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

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

  • 整数和double在OCaml中不是对象,因此它们不能有方法
  • OCaml中的运算符是函数,而不是方法。当然,该语言本来可以设计为使它们成为方法,但是您不能为任何非对象的对象定义自定义运算符
  • 如果编写一个函数,如
    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子类型多态性与绑定时间密切相关。如果你在谈论一种不同类型的多态性,请明确地说出来。