programming-languages - Haskell 中的 "class"和 OO 语言中的 "abstract class"有什么区别?

标签 programming-languages haskell functional-programming typeclass

乍一看,这两种“类(Class)”有明显的区别。但是,我相信还有更多相似之处:

  • 两者都有不同类型的构造函数。
  • 两者都定义了一组可以应用于特定类型数据的操作,换句话说,它们都定义了一个接口(interface)。

  • 我可以看到 Haskell 中的“类”更加简洁,而且效率也更高。但是,我有一种感觉,从理论上讲,“类”和“抽象类”是相同的。

    你怎么看?

    最佳答案

    呃,不是,不是。

    一方面,Haskell 的类型类没有构造函数;数据类型。

    此外,类型类实例并没有真正附加到它所定义的类型,它更像是一个单独的实体。您可以分别导入实例和数据定义,通常考虑“这条数据属于哪个类”并没有什么意义。类型类中的函数也没有对定义实例的数据类型的任何特殊访问。

    类型类实际定义的是标识符的集合,这些标识符可以共享以对不同的数据类型进行概念上等效的事情(在某种意义上),在显式的每个类型的基础上。这就是为什么它被称为临时多态性,与从常规类型变量中获得的标准参数多态性相反。

    它更接近于某些语言中的“重载函数”,其中不同的函数被赋予相同的名称,并且调度是基于参数类型完成的(由于某种原因,其他语言通常不允许基于返回类型的重载,尽管这对类型类没有问题)。

    关于programming-languages - Haskell 中的 "class"和 OO 语言中的 "abstract class"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3938779/

    相关文章:

    r - Lua 替代 optim()

    c - 是否有允许不区分大小写的 C 编译器标志?

    programming-languages - 在 Scala 中访问类外的类型成员

    haskell - 将 Haskell 运算符作为值处理

    haskell - 理解函数式编程中的递归代数类型

    java - Clojure 中的迭代函数参数

    language-agnostic - "lazy evaluation"和 "reactive programming"

    design-patterns - 参数检查调用者和被调用者之间的责任?

    haskell - UndecidableInstances 何时安全?关于 GHC 扩展的一些一般性问题

    performance - GHC 产生冗余核心操作