首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >接口是属于即席多态(即重载)还是子类型多态性?

接口是属于即席多态(即重载)还是子类型多态性?
EN

Stack Overflow用户
提问于 2019-07-18 20:37:25
回答 1查看 499关注 0票数 3

https://wiki.haskell.org/Polymorphism

adopt多态性是指当一个值能够采用几种类型中的任何一种时,因为它或它所使用的值已经为这些类型中的每一种类型都定义了单独的定义。例如,与应用于整数时相比,+运算符在应用于浮点值时所做的事情本质上是完全不同的--在Python中,它甚至可以应用于字符串。大多数语言至少支持一些即席多态,但在C等语言中,它仅限于内置函数和类型。其他语言(如C++ )允许程序员提供自己的重载,提供单个函数的多个定义,并通过参数类型消除歧义。在Haskell中,这是通过类型类和类实例的系统实现的。 尽管名称相似,但Haskell的类型类与大多数面向对象语言的类非常不同。它们与接口有更多的共同点,因为它们通过类型签名指定一系列方法或值,由实例声明来实现。

这是否意味着类型类是实现重载(即临时多态)的一种方法?

OO语言(例如Java、C#)中的接口属于哪种类型的多态性,属于即席多态(即重载)还是子类型多态性?

  • 由于类型类与接口类似,接口是否是实现重载(即即席多态)的方法,就像类型类一样?
  • 接口是否类似于基类,接口是否是实现子类型多态性的一种方式,就像类继承一样?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-07-18 21:57:14

Typeclasses没有类型层次结构,但Typeclasses有。

我不认为类型类是类继承,因为您没有父结构,只有签名。它们可以被看作是OOP语言的经典接口,有点.

但正如你引述的文本所言:

例如,(+)运算符在应用于浮点值时与应用于整数时本质上是完全不同的。

有类型的(+)函数这样简单的东西就不是这样了。

这里有一个需要尊重的TypeClass Num层次结构。例如

代码语言:javascript
运行
复制
plus :: Num a => a -> a -> a
plus x y = x + y

这里有四个直接子类型Integral (由IntIntegral实现)和Fractional (由FloatDouble实现)。IntegralFractional类型是Num类型的亚型。

因此,看看这个函数类型的签名:

代码语言:javascript
运行
复制
(/) :: Fractional a => a -> a -> a

(div) :: Integral a => a -> a -> a

(+) :: Num a => a -> a -> a

每个类型都有自己的实现,并且限制了可以在子类型和超类型的类型层次结构中使用的数据类型,总是谈论Typeclass而不是类型本身的

关于与OOP的关系:

例如,在Java中,类型和类是非常不同的。看:

代码语言:javascript
运行
复制
List<String> xs = new ArrayList<>();
List<String> ys = new LinkedList<>();
xs.add("Haskell");
ys.add("Forever");

那里的类型是List,但是这些列表的行为由 (ArrayList或LinkedList)提供。更重要的是,你可以:

代码语言:javascript
运行
复制
ArrayList<String> ls = new ArrayList<>();
ls.add("something);

是有效的,类型和类是相同的。

另一方面,在Haskell中,(+)方法行为是由类型的实现根据其类型给出的。

在Haskell中有一个典型的有用的Typeclass层次结构的例子:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57102313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档