|
|
1
22
哈斯克尔 代数数据类型 之所以这样命名,是因为它们对应于 初代数 在范畴论中,给我们一些规律、一些操作和一些符号来操纵。我们甚至可以使用代数符号来描述常规数据结构,其中:
带有一些附加符号:
事实上,你可能会说(按照Brent Yorgey的说法),如果Haskell数据类型可以用以下表达式表示,那么它就是正则的
使用这种符号,我们可以简洁地描述许多常规数据结构:
其他业务持有(摘自Brent Yorgey的论文,列于参考文献中):
参考文献
|
|
|
2
100
Haskell支持中的“代数数据类型” 全参数多态性 ,这是泛型在技术上更正确的名称,例如列表数据类型:
等同于(尽可能多,忽略非严格评估等)
当然Haskell的类型系统允许更多。..类型参数的使用很有趣,但这只是一个简单的例子。关于“代数类型”的名称,老实说,我从来没有完全确定它们被命名的确切原因,但我认为这是由于类型系统的数学基础。一、 相信 原因归结为ADT的理论定义是“一组构造函数的产物”,然而,我离开大学已经有几年了,所以我已经记不清具体细节了。 [编辑:感谢Chris Conway指出我的愚蠢错误,ADT当然是求和类型,构造函数提供字段的乘积/元组] |
|
|
3
20
在……里面 universal algebra 一 代数 由几组元素组成 (将每组视为一种类型的值集) 以及一些将元素映射到元素的操作。 例如,假设你有一种“列表元素”和一个 “列表”的类型。作为操作,您有一个“空列表”,它是一个0参数 返回“list”的函数和接受两个参数的“cons”函数, “列表元素”和“列表”,并生成“列表”。 在这一点上,有许多代数符合描述, 因为可能会发生两件不希望的事情:
一个既没有这些不希望的性质的代数被称为 开始的 ,这就是抽象数据类型的预期含义。 名字的首字母来源于一个属性,即 从初始代数到任何给定代数的一个同态。 本质上,您可以通过应用以下操作来评估列表的值 在其他代数中,结果是明确的。 多态类型会变得更加复杂。.. |
|
|
4
12
它们被称为代数的一个简单原因;有求和(逻辑析取)和积(逻辑连词)两种类型。求和类型是一个有区别的并集,例如:
产品类型是具有多个参数的类型:
在O'Caml中,“产品”更加明确:
|
|
|
5
8
Haskell的数据类型被称为“代数”,因为它们与 categorical initial algebras 但这就是疯狂。 @olliej:ADT实际上是“求和”类型。元组是产品。 |
|
|
6
3
@Timbo: 你基本上是对的,它有点像一个有三个派生类(Empty、Leaf和Node)的抽象树类,但你还需要保证使用你的树类的人永远不会添加任何新的派生类,因为使用树数据类型的策略是编写在运行时根据树中每个元素的类型进行切换的代码(添加新的派生类型会破坏现有的代码)。你可以想象这在C#或C++中会变得很糟糕,但在Haskell、ML和OCaml中,这是语言设计和语法的核心,因此编码风格通过模式匹配以更方便的方式支持它。 ADT(求和类型)也有点类似 tagged unions 或 variant types 在C或C++中。 |
|
|
7
2
老问题,但没有人提到可空性,这是代数数据类型的一个重要方面,也许是最重要的方面。由于每个值都是备选值之一,因此可以进行详尽的基于案例的模式匹配。 |
|
|
8
0
对我来说,Haskell代数数据类型的概念在C#等面向对象语言中总是看起来像多态。 请看以下示例 http://en.wikipedia.org/wiki/Algebraic_data_types :
这可以在C#中实现为TreeNode基类,带有派生的Leaf类和派生的TreeNodeWithChildren类,如果你想要一个派生的EmptyNode类。 (好吧,我知道,没有人会这样做,但至少你能做到。) |