答案 0 :(得分:5)
类型类也是一种子类型。
他们不是。为了便于说明,让我们回到TypeScript examples我提到的in that question:
如果我们有一个具有联合类型的值,我们只能访问成员 这对于工会中的所有类型都是通用的。
interface Bird { fly(); layEggs(); } interface Fish { swim(); layEggs(); } function getSmallPet(): Fish | Bird { // ... } let pet = getSmallPet(); pet.layEggs(); // okay pet.swim(); // errors
此处,getSmallPet
的返回类型既不是Fish
也不是Bird
,而是两者的超类型,其成员包含Fish
和{{共有的成员1}}。 Bird
也一个Fish
,Fish | Bird
也是如此。
类型类的情况完全不同:
Bird
虽然foo :: Num a => a -> a
foo x = (x * x) + x
和foo (3 :: Integer)
都有效,但这并不意味着foo (7.7 :: Double)
和Num
也有(3 :: Integer)
对应的超类型。相反,(7.7 :: Double)
所说的所有内容都是您选择的Num a => a -> a
应该有一个a
的实例(并且值得强调的是Num
不是一种类型),所以您选择的类型有Num
和(*)
的合适实现。与OOP方法不同,(+)
和(*)
不属于任何特定类型,因此没有必要引入超类型以便与(+)
和{{1}一起使用它们}。