允许未标记的联合等同于允许类型类?

时间:2016-11-19 16:01:23

标签: haskell type-theory subtyping

this问题中,未标记的联合被描述为一种子类型。

类型类也是一种子类型。

它们在概念上是否相同?他们是,我将如何在Haskell中实现这些?

1 个答案:

答案 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 一个FishFish | 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}一起使用它们}。