【发布时间】:2011-08-20 03:44:30
【问题描述】:
recent blog post on William Cook's Fusings 提到:
关键在于,Ensō 中的结构被整体视为图形,而不是单个值或传统的和积数据结构。
他指的是什么传统的 sum-and-products 数据结构?
【问题讨论】:
标签: data-structures programming-languages types type-systems algebraic-data-types
recent blog post on William Cook's Fusings 提到:
关键在于,Ensō 中的结构被整体视为图形,而不是单个值或传统的和积数据结构。
他指的是什么传统的 sum-and-products 数据结构?
【问题讨论】:
标签: data-structures programming-languages types type-systems algebraic-data-types
他指的是什么传统的 sum-and-products 数据结构?
在类型论中,常规数据结构可以用求和、乘积和递归类型来描述。这导致了用于描述数据结构(以及所谓的代数数据类型)的代数。这种数据类型在静态类型的函数式语言中很常见,例如 ML 或 Haskell。
产品
产品可以被认为是“结构”或“元组”的类型论视图。
正式地,PFPL,第 14 章:
两种类型的二进制积由有序的值对组成,一个来自 每种类型按指定的顺序。相关的消除形式是投影,它选择一对中的第一个和第二个分量。空乘积或单元类型仅由没有值的唯一“空元组”组成,并且没有关联的消除形式。
总和
求和类型表示数据结构变体之间的选择。有时它们被称为“联合类型”(如在 C 中)。许多语言没有求和类型的概念。
PFPL,第 15 章:
大多数数据结构都涉及替代方案,例如 叶和树中的一个内部节点,或者一个选择的最外层形式 一段抽象语法。重要的是,选择决定了结构 的价值。例如,节点有孩子,但叶子没有,所以 向前。这些概念用 sum 类型表示,特别是二进制 sum,它提供了两个事物的选择,以及 nullary sum,它提供了 无所事事的选择。
递归类型
除了乘积和求和之外,我们还可以引入递归,因此可以(部分)根据自身定义类型。很好的例子包括树和列表。
data List a = Empty | a : List a
data Tree a = Nil | Node a (Tree a) (Tree a)
和、积和递归的代数
给一个类型,比如Int,我们可以开始为描述数据结构的代数表达式建立一个符号:
一个单独的变量:
Int
两种类型的产品(表示一对):
Int * Bool
两种类型的总和(表示两种类型之间的选择):
Int + Bool
还有一些常量:
1 + Int
其中1 是单位类型,()。
一旦你能用这种方式描述类型,你就可以免费获得一些很酷的功能。首先,描述数据类型的一个非常简洁的符号,其次,一些结果从其他代数转移(例如differentiation works on data structures)。
示例
单位类型,data () = ()
一个元组,最简单的产品类型:data (a,b) = (a,b)
一个简单的sum类型,data Maybe a = Nothing | Just a
及其替代品,
还有一个递归类型,链表的类型:data [a] = [] | a : [a]
鉴于这些,您可以通过组合和、乘积和递归类型来构建相当复杂的结构。
例如。产品总和的产品列表的简单表示法:[(Maybe ([Char], Double), Integer)] 产生了一些非常复杂的树:
参考文献
【讨论】:
dot 使用名为 vacuum 的库遍历 Haskell 堆中的数据结构生成的。
已经给出了非常详细的答案,但不知何故他们没有提到这个简单的事实。
之所以这样称呼求和类型,是因为求和类型的可能值的数量是两个基础类型的值数量的总和。 同样对于产品类型,可能值的数量是产品。
这源于将类型定义为一组值的类型理论。
data MySumType = Foo Bool | Bar Char
data MyProductType = Baz (Bool, Char)
现在你永远不会忘记哪个是哪个。
【讨论】:
他指的是函数式编程语言的标准algebraic data types。
例子:
如果a 是A 类型,而b 是B 类型,那么(a, b) 是A x B 类型,即product type。
具有Nil 或Cons x xs 形式的值的列表类型是sum type。
Ensō 显然比这些树状代数类型更强调图形。
【讨论】:
来自大学提供的 Coursera 课程“编程语言”的讲义。华盛顿:
“为什么要乘积和求和?这与布尔代数中 0 为假而 1 为真,其工作方式类似于乘法或或类似加法的事实有关。”
【讨论】: