当前位置: 首页 > 面试题库 >

Java的接口和Haskell的类型类:区别和相似之处?

顾承平
2023-03-14
问题内容

当我学习Haskell时,我注意到它的 type class ,这应该是源自Haskell的伟大发明。

但是,在Wikipedia页面上,类型为class:

程序员通过指定一组函数或常量名称以及它们各自的类型来定义类型类,对于每个属于该类的类型,它们必须存在。

对我来说,这似乎与 Java的接口
非常接近(引用Wikipedia的Interface(Java)页面):

Java编程语言中的接口是一种抽象类型,用于指定类必须实现的接口(在通用意义上)。

这两个看起来很相似:类型类限制类型的行为,而接口限制类的行为。

我想知道Haskell中的类型类和Java中的接口之间有什么区别和相似之处,或者根本上有区别吗?

编辑:
我甚至注意到haskell.org也承认它们是相似的。如果它们是如此相似(或者是?),那么为什么用此类炒作来处理类型类呢?

更多编辑: 哇,这么多好答案!我想我必须让社区决定哪一个是最好的。但是,在阅读答案时,所有这些似乎都只是在说:
typeclass可以做很多事情,而interface不能或不必应付泛型”
。我不禁想知道, 接口 有什么 可以做而类型类不能做吗?
另外,我注意到Wikipedia声称typeclass最初是在1989年的论文中发明的“如何使ad hoc多态性减少ad
hoc”,而Haskell仍处于摇篮中,而Java项目始于1991年并于1995年首次发布因此,
也许不是typetype与接口类似,而是接口受typeclass影响?* 是否有任何文件/文件支持或反驳?感谢所有答案,它们都非常有启发性!

感谢您的所有投入!


问题答案:

我会说一个接口有点像一个类型类SomeInterface t,其中所有值都具有类型t -> whatever(其中whatever不包含t)。这是因为有了Java和类似语言中的继承关系,所调用的方法取决于调用它们的对象的类型,而没有别的。

这意味着很难add :: t -> t -> t通过接口实现类似的功能,因为在一个以上的参数上它是多态的,因为接口无法指定该方法的参数类型和返回类型与的类型相同。被调用的对象(即“自我”类型)。使用Generics,有一种方法可以通过用通用参数(该参数应该与对象本身具有相同的类型)制作一个接口来伪造此伪装,例如Comparable<T>,它应如何使用,Foo implements Comparable<Foo>以便您compareTo(T otherobject)具有类型t -> t -> Ordering。但这仍然需要程序员遵循此规则,并且当人们想要创建使用此接口的函数时,还必须引起麻烦,因为他们必须具有递归的泛型类型参数。

同样,您不会有类似的事情,empty :: t因为您不在这里调用函数,因此它不是方法。



 类似资料:
  • 本文向大家介绍Java中接口和抽象类的区别与相同之处,包括了Java中接口和抽象类的区别与相同之处的使用技巧和注意事项,需要的朋友参考一下 1. 抽象类: (1).概念:抽象类是对一种事物的抽象,即对类抽。.抽象类是对整个类整体进行抽象,包括属性、行为。Java抽象类和Java接口一样,都用来声明一个新的类型。并且作为一个类型的等级结构的起点。 (2).格式: (3).说明: A:抽象类中不一定有

  • 问题内容: 在Python中,假设我有一个函数希望与一些辅助参数一起传递(为简单起见,它只是第一个保留变量的参数)。 这两种方式(如果有)之间有什么区别? 例如,在的文档页面中,有以下引号: 类中定义的对象的行为类似于静态方法,并且在实例属性查找期间不会转换为绑定方法。 如果用于从提供给类的参数中创建类方法(在构造函数中或稍后通过函数),则lambda方法是否会因此遭受苦难? 问题答案: Lamb

  • 理解抽象 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择显得比较随意。 其实,

  • 我需要为对后端服务器的HTTP请求创建某种类型(使用Angular 2),例如:}, 我应该用什么来构建这些模型?谢谢!

  • 问题内容: 斯卡拉 在Scala中,哪里可以观察到类和类型之间的差异?为什么这种区别很重要? 在编程Scala时,它只是从语言设计的角度考虑还是具有“实际”影响? 或者是根本,以“固定边界”的类型系统(,来我的心)? 爪哇 在Java中还可以识别出上面提到的许多注意事项/差异/问题? (有关语言的介绍,请参见类型和类之间的区别?。) 问题答案: 当您说“类型”时,我将假设您主要是指静态类型。但是我