回答
类型类也是子类型的一种形式。
他们不是。为了说明起见,让我们回到TypeScript examples我在这个问题提到:
如果我们有一个具有联合类型的值,我们只能访问成员 通用于所有类型的工会。
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
的超类型。 A Fish
是也是 a 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方法不同,(*)
和(+)
不属于任何特定类型,因此不需要引入超类型以便与Integer
和Double
一起使用它们。
这个答案有很大帮助,谢谢。尽管如此,我还是觉得这两个概念至少是相关的,因为'Pet'示例也可以通过类型类来实现。作为一个问题表达为:“类型级别约束与未标记的工会一样强大吗?” (尽管这可能更适合作为后续问题)。 – ThreeFx
@ThreeFx我们可以说,在这种情况下,他们将是实现相同目标的两种截然不同的方式。顺便说一下,值得注意的是,未标记的方面对于讨论来说不是必需的 - 如果我们在TypeScript示例中有一个''Oviparous''接口和一个''''''''''''''''''可以扩展的'layEggs'方法,根本区别将保持不变。一个相关的,如果有些切向的问题:[*参数多态性与Ad-hoc多态性*](http://stackoverflow.com/q/6730126/2751851)。 – duplode
- 1. SQLScript:标量类型是不允许
- 2. 允许多个类
- 3. 不允许使用类型同义词的类型实例
- 4. HTML脚本标记允许哪些语言类型?
- 5. 为什么模板允许未完成类的方法类型?
- 6. 类型名称不允许的,从主()
- 7. 请求类型System.Web.AspNetHostingPermission的”允许失败
- 8. 只允许ArrayList中的特定类型
- 9. 关于允许许多不同类型构造函数的最佳实践?
- 10. 通用的约束,允许类型为2个不同类别
- 11. javascript标记 - 它允许标记
- 12. C++错误:类型名称不允许
- 13. “不完整类型不允许”错误
- 14. 允许空值 - 输入类型编号
- 15. Android:字体错误:类型不允许。
- 16. ActiveRecord是否允许自定义类型?
- 17. 允许用户更改地图类型
- 18. 类型名称不允许和期望)
- 19. 错误:不完全类型不允许
- 20. 为什么socketpair()允许SOCK_DGRAM类型?
- 21. Azure SAS允许的服务和允许的资源类型之间的关系
- 22. 允许列表中的所有类型的泛型类型
- 23. 阵列允许不允许
- 24. 如何限制在泛型类中允许为“T”的类型?
- 25. 非类型模板 - 哪些类型是允许的?
- 26. D中允许使用未知类型参数的函数吗?
- 27. 类内类 - 不完整类型是不允许的
- 28. 修改htmlpurifier允许标签此标记
- 29. 我如何使不允许列允许空和允许空列不允许空
- 30. 你会允许这种类型的查询吗?
我认为Haskell没有子类型,因为它会被传统定义,因为每个值都有一个_one_类型。类型类只是扩展类型语言以允许用户定义的多态性的一种方式。也就是说,它让一个值'x'具有'C a => a'的类型,其中'C'是一组规则'a'必须符合的;但是'x'仍然只有一种类型。将其与OOPy子类型相对比,其中值'x'具有多种类型:其基本类型和从基本类型中继承的任何类型。 – hao
另一个更迂腐的论点:子类型会抑制Haskell编译器具有的DHM类型主体类型推断,而类型类不会。 – hao
详细说明@ haoformayor的观点:不要混淆子类型和ad-hoc多态。子类型是ad-hoc多态的一种风格,类型类是一个相当不同的类型。 –