Haskell的TypeClasses和Go的接口

Haskell的TypeClass和Go的接口之间有何异同?两种方法的相对优缺点是什么?


智慧大石
浏览 303回答 3
3回答

大话西游666

Go接口看起来就像只是表面上的样子,就像Haskell中的单参数类型类(构造函数类)一样。方法与接口类型相关联对象(特定类型)可能具有该接口的实现我不清楚Go是否以任何方式支持通过接口的有界多态性,这是类型类的主要目的。也就是说,在Haskell中,接口方法可以用于不同的类型,class I a where    put :: a -> IO ()    get :: IO ainstance I Int where    ...instance I Double where    ....所以我的问题是Go是否支持类型多态性。如果不是,它们根本就不像类型类。它们并不是真正可比的。Haskell的类型类允许通过“泛型”(更高种类的多态性)对代码进行强大的重用-本文为此类形式的泛型程序的跨语言支持提供了很好的参考。通过类型类的即席或有界多态性在此处得到了很好的描述。这是Haskell中类型类的主要目的,并且没有通过Go接口来解决,这意味着它们根本不是非常相似。严格来说,接口的功能不那么强大-一种零阶类型类。

慕慕森

我将在唐·斯图尔特(Don Stewart)的出色回答中补充说,Haskell类型类的令人惊讶的结果之一是,您可以在编译时使用逻辑编程来生成一个类的任意多个实例。(Haskell的类型类系统实际上是Prolog的免删减子集,与Datalog非常相似。)该系统在QuickCheck库中得到了极大的利用。或者举一个非常简单的例子,您可以看到如何定义一个布尔补数(not)版本,该版本可用于任意arity谓词。我怀疑这种能力是类型类系统的意外结果,但是事实证明它非常强大。

杨魅力

在haskell类型中,类的实例化是显式的(即,您必须说说instance Foo BarBar是Foo的实例),而在实现中,接口是隐式的(即,当您定义一个定义了正确方法的类时,它会自动实现相应的接口而无需不得不说implement InterfaceName)。接口只能描述接口实例为接收者的方法。在类型类中,实例化类型可以出现在函数的任何参数位置或返回类型处(即,可以说,如果Foo是Bar类型的实例,则必须有一个名为baz的函数,该函数需要一个Int并返回一个Foo-您不能在接口上这么说)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go