什么是“和 – 产品”数据结构?
William Cook's Fusings最近的博客文章提到:
关键的一点是,Ensō中的结构被整体看作是graphics,而不是个体价值或传统的和 – 产品数据结构。
传统的总和和产品数据结构他指的是什么?
传统的总和和产品数据结构他指的是什么?
在types理论中,规则数据结构可以用和,产品和recursiontypes来描述。 这导致了描述数据结构的代数 (和所谓的代数数据types )。 这种数据types在静态types函数语言(如ML或Haskell)中很常见。
制品
产品可以被认为是“结构”或“元组”的types论理论。
正式,PFPL,第14章:
两种types的二元产品由有序的值对组成,每种types按规定的顺序排列。 相关的消除forms是投影,它们select一对中的第一个和第二个分量。 空值产品或单元types仅由唯一的“空元组”,没有任何值,也没有相关的消除forms。
总和
总和types表示数据结构变体之间的select。 有时他们被称为“工会types”(如C)。 许多语言没有和types的概念。
PFPL,第15章:
大多数数据结构都涉及到替代方法,例如树中叶和内部节点之间的区别,或者抽象语法最外层的select。 重要的是,select决定了价值的结构。 例如,节点有孩子,但是树叶没有,等等。 这些概念是用和types来表示的,具体地说是二元和,它提供了两种select,而零点和,它提供了一个没有任何东西的select。
recursiontypes
随着产品和总和,我们可以引入recursion,所以一个types可以被定义(部分)就其本身而言。 很好的例子包括树和列表。
data List a = Empty | a : List a data Tree a = Nil | Node a (Tree a) (Tree a)
和数,产品和recursion的代数
给一个types,比如Int
,我们可以开始build立一个代数expression式的符号来描述数据结构:
一个单独的variables:
Int
两种types的产品(表示一对):
Int * Bool
两种types的总和(表示两种types之间的select):
Int + Bool
还有一些常数:
1 + Int
其中1
是单位types, ()
。
一旦你用这种方式来描述types,你就可以免费获得一些很酷的function。 首先,描述数据types的简明表示法,其次是从其他代数转移的结果(例如数据结构的差异化 )。
例子
单位typesdata () = ()
data (a,b) = (a,b)
一个简单的总和types , data Maybe a = Nothing | Just a
data Maybe a = Nothing | Just a
和其替代scheme,
和一个recursiontypes ,链表的types是: data [a] = [] | a : [a]
data [a] = [] | a : [a]
鉴于这些,您可以通过组合和,产品和recursiontypes来构build相当复杂的结构。 例如,产品总和产品列表的简单表示法[(Maybe ([Char], Double), Integer)]
会产生一些相当复杂的树:
参考
- 编程语言的实践基础,Robert Harper,2011, http://www.cs.cmu.edu/~rwh/plbook/book.pdf
- 快速介绍数据types的代数, http://blog.lab49.com/archives/3011 (链接似乎已经死了)
- 物种和函数和types,哦,我!,布伦特Yorgey, http://www.cis.upenn.edu/~byorgey/papers/species-pearl.pdf – 有一个非常好的代数,Haskell数据types的概述,以及与math的组合物种的联系。
已经给出了非常详细的答案,但不知何故,他们没有提到这个简单的事实。
和types被调用,因为和types的可能值的数量是两个基础types的值的总和 。 同样,对于产品types,可能值的数量就是产品。
这源于types理论,将types定义为一组值。
data MySumType = Foo Bool | Bar Char data MyProductType = Baz (Bool, Char)
- Bool是一组2个值。
- Char是一组256个值。
- MySumType是一组2 + 256值。
- MyProductType是一组2 * 256值。
现在你永远不会忘记哪个是哪个。
他指的是函数式编程语言的标准代数数据types 。
例子:
-
如果
a
是A
型,b
是B
型,则(a, b)
是A x B
,这是一种产品types 。 -
列表types的forms为
Nil
或Cons x xs
是一个总和types 。
Ensō显然比这些树状代数types更重视图。
从Coursera课程的讲义,大学提供的“编程语言”。 华盛顿:
“为什么是积和?这与布尔代数有关,其中0是错误的,1是真的,并且像乘法和或加法一样工作。