![]() |
1
22
Haskell支持中的“代数数据类型” 全参数多态性 ,这是更准确的泛型名称,作为一个简单示例,list数据类型:
相当于(尽可能多,忽略不严格的评估等)
当然,哈斯克尔的类型系统允许更多…类型参数的使用很有趣,但这只是一个简单的例子。关于“代数类型”的名称,老实说,我从来没有完全确定它们被命名为“代数类型”的确切原因,但我认为这是由于类型系统的数学基础。我 相信 原因可以归结为ADT的理论定义是“一组建设者的产品”,然而,我从大学毕业已经有几年了,所以我再也记不起细节了。 [编辑:感谢ChrisConway指出了我的愚蠢错误,ADT当然是SUM类型,构造函数提供了字段的产品/元组] |
![]() |
2
100
哈斯克尔 代数数据类型 因为它们对应于 初始代数 在范畴论中,给我们一些规律,一些操作和一些符号来操纵。我们甚至可以使用代数符号来描述规则数据结构,其中:
加上一些附加符号:
事实上,您可能会说(遵循布伦特·约尔基),如果haskell数据类型可以表示为
使用这个符号,我们可以简明地描述许多常规数据结构:
其他业务保留(摘自布伦特·约基的论文,见参考文献):
参考文献:
|
![]() |
3
20
在 universal algebra 安 代数 由若干组元素组成 (将每一组都视为一个类型的值集) 以及一些将元素映射到元素的操作。 例如,假设您有“list elements”类型和 “列表”的类型。作为操作,您有“空列表”,这是一个0参数 返回“list”和接受两个参数的“cons”函数的函数, 一个“列表元素”和一个“列表”,并生成一个“列表”。 此时有许多代数符合描述, 因为可能会发生两件不受欢迎的事情:
一个既没有这些不良性质的代数叫做 最初的 ,这是抽象数据类型的预期含义。 名称的初始值来自 从初等代数到任何给定代数的同态。 本质上,您可以通过应用操作来评估列表的值。 在另一个代数中,结果是明确的。 对于多态类型来说,它变得更加复杂… |
![]() |
4
12
它们被称为代数的一个简单原因;有和(逻辑析取)和积(逻辑合取)两种类型。求和类型是一个有区别的联合,例如:
产品类型是具有多个参数的类型:
在O'Caml中,“产品”更加明确:
|
![]() |
5
8
由于haskell的数据类型与 categorical initial algebras . 但这就是疯狂。 @奥利:ADT实际上是“求和”类型。元组是产品。 |
![]() |
6
3
@ Timbo: 你基本上是对的,它有点像一个抽象的树类,有三个派生类(空类、叶类和节点类),但是你也需要强制保证使用树类的人永远不能添加任何新的派生类,因为使用树数据类型的策略是写代码,在运行时基于n树中每个元素的类型(添加新的派生类型将破坏现有代码)。你可以想象这在C语言或C++中变得很讨厌,但是在Haskell、ML和OcAML中,这是语言设计和语法的核心,所以编码风格通过模式匹配更方便地支持它。 ADT(SUM类型)也有点像 tagged unions 或 variant types 在C或C++中。 |
![]() |
7
2
旧问题,但没有人提到空性,这是代数数据类型的一个重要方面,也许是最重要的方面。由于每个值都是可选的,因此完全基于案例的模式匹配是可能的。 |
![]() |
8
0
对我来说,haskell的代数数据类型的概念在像c_这样的OO语言中总是看起来像多态性。 看看下面的例子 http://en.wikipedia.org/wiki/Algebraic_data_types :
这可以在C中实现为TreeNode基类,具有派生的Leaf类和派生的TreeNodeWithChildren类,如果您甚至想要派生的EmptyNode类。 (好吧,我知道,没人会这么做,但至少你能做到。) |
![]() |
Dan OneaÈÄ · 玫瑰树的初始代数 7 年前 |
|
Bob T · Haskell嵌套代数数据类型 7 年前 |
![]() |
Werner de Groot · 扩展代数数据类型 9 年前 |
|
Aton · data.Tree.zipper中拉链数据类型中的冗余信息? 11 年前 |