Haskell的TypeClasses和Go的接口有什么相似之处和不同之处?这两种方法的相对优缺点是什么?
答案 0 :(得分:24)
看起来only in superficial ways是Go接口,就像Haskell中的单参数类型类(构造函数类)一样。
我不清楚Go是否以任何方式通过接口支持有界多态性,这是类型类的主要目的。也就是说,在Haskell中,接口方法可以用于不同的类型,
class I a where
put :: a -> IO ()
get :: IO a
instance I Int where
...
instance I Double where
....
所以我的问题是Go是否支持类型多态。如果没有,他们根本不喜欢类型类。而且他们并没有真正的可比性。
Haskell的类型类允许通过“泛型”强大地重用代码 - 更高的kinded多态性 - cross-language support for such forms of generic program is this paper的良好参考。
通过类型类的临时或有界多态是well described here。这是Haskell中类型类的主要目的,并且没有通过Go接口解决,这意味着它们根本不是非常相似。接口严格不那么强大 - 一种零阶类型。
答案 1 :(得分:7)
instance Foo Bar
使Bar成为Foo的一个实例),而实现接口是隐式的(即当你定义一个定义正确方法的类时) ,它自动实现相应的界面,而不必说implement InterfaceName
)。答案 2 :(得分:6)
我将补充Don Stewart的优秀答案,即Haskell类型类的一个令人惊讶的后果是,您可以在编译时使用逻辑编程来生成任意多个类的实例。 (Haskell的类型系统包括Prolog的无切割子集,与Datalog非常相似。)该系统在QuickCheck库中被充分利用。或者,对于一个非常简单的示例,您可以看到如何定义version of Boolean complement (not
) that works on predicates of arbitrary arity。我怀疑这种能力是类型级系统的意外结果,但事实证明它非常强大。
Go没有任何喜欢它。
答案 3 :(得分:5)
非常肤浅的相似之处,Go的界面更像是OCaml中的结构子类型。
答案 4 :(得分:3)
C++ Concepts(没有进入C ++ 0x)就像Haskell类型一样。还有一些“公理”根本不存在于Haskell中。他们让你正式化monad法则。