1

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

类型类也是子类型的一种形式。

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

4

1 回答 1

6

类型类也是子类型的一种形式。

他们不是。为了便于说明,让我们回到我在那个问题中提到的TypeScript 示例

如果我们有一个联合类型的值,我们只能访问联合中所有类型共有的成员。

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和和的共同成员Bird。AFish也是a , a也是Fish | BirdBird

类型类发生的情况完全不同:

foo :: Num a => a -> a
foo x = (x * x) + x

虽然foo (3 :: Integer)and都foo (7.7 :: Double)可以工作,但这并不意味着有一个对应的超类型Num并且(3 :: Integer)(7.7 :: Double)有。相反,所有这一切Num a => a -> a都是您选择的a应该有一个实例Num(值得强调的是,它不是类型) ,以便您选择的类型Num有合适的实现。与 OOP 方法不同,并且不属于任何特定类型,因此无需引入超类型即可将它们与和一起使用。(*)(+)(*)(+)IntegerDouble

于 2016-11-19T16:43:13.413 回答