gpt4 book ai didi

oop - 为什么 Haskell 代数数据类型是 "closed"?

转载 作者:行者123 更新时间:2023-12-03 05:46:49 24 4
gpt4 key购买 nike

如果我错了,请纠正我,但看起来 Haskell 中的代数数据类型在许多需要在 OO 语言中使用类和继承的情况下都很有用。但有一个很大的区别:代数数据类型一旦声明,就不能在其他地方扩展。它是“封闭的”。在面向对象中,您可以扩展已经定义的类。例如:

data Maybe a = Nothing | Just a

如果不修改此声明,我无法在以后以某种方式向此类型添加另一个选项。那么这个系统有什么好处呢?看来 OO 方式的可扩展性会更好。

最佳答案

答案与代码易于扩展的方式有关,类和代数数据类型之间的紧张关系被 Phil Wadler 称为“表达式问题”:

  • 对于代数数据类型,

    • 在事物上添加新的操作非常便宜:您只需定义一个新函数即可。这些东西上的所有旧功能将继续保持不变。

    • 添加一种新的类型的东西非常昂贵:您必须为现有数据类型添加一个新的构造函数,并且您必须>编辑并重新编译使用该类型的每个函数

  • 有类(class),

    • 添加一种新的类型的东西非常便宜:只需添加一个新的子类,然后根据需要在该类中定义专门的方法,对于所有现有操作。父类(super class)和所有其他子类继续保持不变。

    • 在事物上添加新的操作非常昂贵:您必须向父类(super class)添加新的方法声明并可能向每个现有子类添加方法定义。实际上,根据方法的不同,负担也有所不同。

因此,代数数据类型是封闭的,因为封闭类型可以很好地支持某些类型的程序演化。例如,如果您的数据类型定义了一种语言,则可以轻松添加新的编译器 channel ,而无需使旧的编译器 channel 无效或更改数据。

可以有“开放”数据类型,但除非在仔细控制的情况下,否则类型检查会变得困难。 托德·米尔斯坦做了一些very beautiful work 基于支持开放代数类型和可扩展函数的语言设计,所有这些都带有模块化类型检查器。我发现阅读他的论文非常愉快。

关于oop - 为什么 Haskell 代数数据类型是 "closed"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/870919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com