程序员通过指定一组函数或常量名称及其各自的类型来定义类型类,该类必须存在于属于该类的每种类型中。
这对我来说似乎非常接近Java的接口(引用维基百科的Java接口页面):
Java编程语言中的接口是用于指定必须实现接口(在通用意义上)的类的抽象类型。
这两个看起来相似:类型类限制了类型的行为,而接口限制了类的行为。我想知道Haskell中的类型类和Java中的接口之间有什么区别和相似之处,或者它们本质上是不同的?
编辑:我注意到甚至haskell.org也承认它们很相似。如果它们如此相似(或者它们是这样吗?),那么为什么类型类受到如此大的关注?
更新:哇,有这么多优秀的答案!我想我必须让社区决定哪个是最好的。然而,在阅读这些答案时,它们似乎都只是说“类型类可以做很多事情,而接口不能或必须处理泛型”。我不禁想知道,接口能做什么而类型类做不了呢? 另外,我注意到维基百科声称类型类最初是在1989年的论文《如何使特定的多态性更不那么临时》中发明的,当时Haskell还处于起步阶段,而Java项目始于1991年,首次发布于1995年。所以也许与其说类型类类似于接口,不如说是接口受到了类型类的影响? 是否有任何支持或反驳这一观点的文件/论文?感谢所有的答案,它们都非常启发人!
感谢所有的输入!