3 回答
TA贡献1817条经验 获得超14个赞
Go接口看起来就像只是表面上的样子,就像Haskell中的单参数类型类(构造函数类)一样。
方法与接口类型相关联
对象(特定类型)可能具有该接口的实现
我不清楚Go是否以任何方式支持通过接口的有界多态性,这是类型类的主要目的。也就是说,在Haskell中,接口方法可以用于不同的类型,
class I a where
put :: a -> IO ()
get :: IO a
instance I Int where
...
instance I Double where
....
所以我的问题是Go是否支持类型多态性。如果不是,它们根本就不像类型类。它们并不是真正可比的。
Haskell的类型类允许通过“泛型”(更高种类的多态性)对代码进行强大的重用-本文为此类形式的泛型程序的跨语言支持提供了很好的参考。
通过类型类的即席或有界多态性在此处得到了很好的描述。这是Haskell中类型类的主要目的,并且没有通过Go接口来解决,这意味着它们根本不是非常相似。严格来说,接口的功能不那么强大-一种零阶类型类。
TA贡献1856条经验 获得超17个赞
我将在唐·斯图尔特(Don Stewart)的出色回答中补充说,Haskell类型类的令人惊讶的结果之一是,您可以在编译时使用逻辑编程来生成一个类的任意多个实例。(Haskell的类型类系统实际上是Prolog的免删减子集,与Datalog非常相似。)该系统在QuickCheck库中得到了极大的利用。或者举一个非常简单的例子,您可以看到如何定义一个布尔补数(not
)版本,该版本可用于任意arity谓词。我怀疑这种能力是类型类系统的意外结果,但是事实证明它非常强大。
TA贡献1811条经验 获得超6个赞
在haskell类型中,类的实例化是显式的(即,您必须说说
instance Foo Bar
Bar是Foo的实例),而在实现中,接口是隐式的(即,当您定义一个定义了正确方法的类时,它会自动实现相应的接口而无需不得不说implement InterfaceName
)。接口只能描述接口实例为接收者的方法。在类型类中,实例化类型可以出现在函数的任何参数位置或返回类型处(即,可以说,如果Foo是Bar类型的实例,则必须有一个名为baz的函数,该函数需要一个Int并返回一个Foo-您不能在接口上这么说)。
- 3 回答
- 0 关注
- 302 浏览
添加回答
举报