https://wiki.haskell.org/Polymorphism说
adopt多态性是指当一个值能够采用几种类型中的任何一种时,因为它或它所使用的值已经为这些类型中的每一种类型都定义了单独的定义。例如,与应用于整数时相比,+运算符在应用于浮点值时所做的事情本质上是完全不同的--在Python中,它甚至可以应用于字符串。大多数语言至少支持一些即席多态,但在C等语言中,它仅限于内置函数和类型。其他语言(如C++ )允许程序员提供自己的重载,提供单个函数的多个定义,并通过参数类型消除歧义。在Haskell中,这是通过类型类和类实例的系统实现的。 尽管名称相似,但Haskell的类型类与大多数面向对象语言的类非常不同。它们与接口有更多的共同点,因为它们通过类型签名指定一系列方法或值,由实例声明来实现。
这是否意味着类型类是实现重载(即临时多态)的一种方法?
OO语言(例如Java、C#)中的接口属于哪种类型的多态性,属于即席多态(即重载)还是子类型多态性?
谢谢。
发布于 2019-07-18 21:57:14
Typeclasses没有类型层次结构,但Typeclasses有。
我不认为类型类是类继承,因为您没有父结构,只有签名。它们可以被看作是OOP语言的经典接口,有点.
但正如你引述的文本所言:
例如,
(+)
运算符在应用于浮点值时与应用于整数时本质上是完全不同的。
有类型的(+)
函数这样简单的东西就不是这样了。
这里有一个需要尊重的TypeClass
Num
层次结构。例如
plus :: Num a => a -> a -> a
plus x y = x + y
这里有四个直接子类型Integral
(由Int
和Integral
实现)和Fractional
(由Float
和Double
实现)。Integral
和Fractional
类型是Num
类型的亚型。
因此,看看这个函数类型的签名:
(/) :: Fractional a => a -> a -> a
(div) :: Integral a => a -> a -> a
(+) :: Num a => a -> a -> a
每个类型都有自己的实现,并且限制了可以在子类型和超类型的类型层次结构中使用的数据类型,总是谈论Typeclass
而不是类型本身的。
关于与OOP的关系:
例如,在Java中,类型和类是非常不同的。看:
List<String> xs = new ArrayList<>();
List<String> ys = new LinkedList<>();
xs.add("Haskell");
ys.add("Forever");
那里的类型是List
,但是这些列表的行为由类 (ArrayList或LinkedList)提供。更重要的是,你可以:
ArrayList<String> ls = new ArrayList<>();
ls.add("something);
是有效的,类型和类是相同的。
另一方面,在Haskell中,(+)
方法行为是由类型的实现根据其类型给出的。
在Haskell中有一个典型的有用的Typeclass
层次结构的例子:
https://stackoverflow.com/questions/57102313
复制相似问题