为了账号安全,请及时绑定邮箱和手机立即绑定

Haskell的TypeClasses和Go的接口

Haskell的TypeClasses和Go的接口

Go
智慧大石 2021-04-04 16:19:03
Haskell的TypeClass和Go的接口之间有何异同?两种方法的相对优缺点是什么?
查看完整描述

3 回答

?
大话西游666

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接口来解决,这意味着它们根本不是非常相似。严格来说,接口的功能不那么强大-一种零阶类型类。


查看完整回答
反对 回复 2021-04-26
?
慕慕森

TA贡献1856条经验 获得超17个赞

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



查看完整回答
反对 回复 2021-04-26
?
杨魅力

TA贡献1811条经验 获得超6个赞

  1. 在haskell类型中,类的实例化是显式的(即,您必须说说instance Foo BarBar是Foo的实例),而在实现中,接口是隐式的(即,当您定义一个定义了正确方法的类时,它会自动实现相应的接口而无需不得不说implement InterfaceName)。

  2. 接口只能描述接口实例为接收者的方法。在类型类中,实例化类型可以出现在函数的任何参数位置或返回类型处(即,可以说,如果Foo是Bar类型的实例,则必须有一个名为baz的函数,该函数需要一个Int并返回一个Foo-您不能在接口上这么说)。


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 302 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信