Thr*_*eFx 1 haskell type-theory subtyping
在这个问题中,未标记的联合被描述为一种子类型.
类型类也是子类型的一种形式.
它们在概念上是等同的吗?他们是,我将如何在Haskell中实现这些?
类型类也是子类型的一种形式.
他们不是.为了便于说明,让我们回到我在该问题中提到的TypeScript示例:
如果我们有一个具有union类型的值,我们只能访问union中所有类型共有的成员.
Run Code Online (Sandbox Code Playgroud)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.一个Fish是还一个Fish | Bird,所以是一个Bird.
类型类会发生什么不同:
foo :: Num a => a -> a
foo x = (x * x) + x
Run Code Online (Sandbox Code Playgroud)
虽然这两个foo (3 :: Integer)和foo (7.7 :: Double)工作,这并不意味着有对应于超Num说(3 :: Integer),并(7.7 :: Double)也有.相反,所有Num a => a -> a说的是,你的选择a应具有的一个实例Num(这是值得强调的是,Num不是一个类型),以便有合适的实现(*)和(+)您所选择的类型.不同于OOP方法,(*)并且(+)不属于任何特定类型的,所以它是没有必要的,以便既使用它们引入超Integer和Double.
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |