Haskell的TypeClasses和Go的接口

时间:2010-06-05 20:38:58

标签: programming-languages haskell interface go typeclass

Haskell的TypeClasses和Go的接口有什么相似之处和不同之处?这两种方法的相对优缺点是什么?

5 个答案:

答案 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)

  1. 在haskell中,类型类实例化是显式的(即你必须说instance Foo Bar使Bar成为Foo的一个实例),而实现接口是隐式的(即当你定义一个定义正确方法的类时) ,它自动实现相应的界面,而不必说implement InterfaceName)。
  2. 接口只能描述接口实例是接收者的方法。在类型类中,实例化类型可以出现在任何参数位置或函数的返回类型中(也就是说,如果Foo是类型为Bar的实例,则必须有一个名为baz的函数,它接受一个I​​nt并返回一个Foo - 你不能用接口说。)

答案 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法则。