【发布时间】:2010-10-26 15:14:55
【问题描述】:
如果我错了,请纠正我,但 Haskell 中的代数数据类型似乎在您将在 OO 语言中使用类和继承的许多情况下很有用。但是有一个很大的区别:一旦声明了代数数据类型,就不能在其他地方进行扩展。它是“关闭的”。在 OO 中,您可以扩展已定义的类。例如:
data Maybe a = Nothing | Just a
如果不修改此声明,我以后无法以某种方式向此类型添加另一个选项。那么这个系统有什么好处呢?看起来OO方式的可扩展性要好得多。
【问题讨论】:
-
您应该将 Haskell 的数据类型视为结构和枚举的增强版本(在 C 意义上,不确定其他语言如何使用它们)。它们只是愚蠢的数据。真正的 OOP 意义上的对象和类具有相当多的控制和业务逻辑,在 Haskell 中,您将使用高阶函数、函数记录、类型类等等。
-
我想知道这是不是一个很好的类比:用 Java 术语重新表述 Haskell(选择一种流行的 OOP 语言),数据类型就像最终类,类型类就像 JDK8 接口(包括默认方法,它使接口非常接近于直接多重继承!))。构造函数支持组合。因此,通过这个类比,您可以看到,通过“放弃”只是实现继承,Haskell 确实“失去”了传统 OOP 中的任何力量——如果有的话,它只是切断了一个有点危险且容易被替换的工具更安全的替代品?
-
我相信您可以通过创建一个包含旧数据类型作为一个选项的新数据类型来扩展它们
标签: oop haskell types functional-programming type-systems