在这个问题中,未标记的联合被描述为一种子类型。
类型类也是子类型的一种形式。
它们在概念上是否等效?他们是,我将如何在 Haskell 中实现这些?
类型类也是子类型的一种形式。
他们不是。为了便于说明,让我们回到我在那个问题中提到的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 | Bird
Bird
类型类发生的情况完全不同:
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 方法不同,并且不属于任何特定类型,因此无需引入超类型即可将它们与和一起使用。(*)
(+)
(*)
(+)
Integer
Double