什么是“和 – 产品”数据结构?

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)

在这里输入图像说明

一个简单的总和typesdata 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)]会产生一些相当复杂的树:

在这里输入图像说明


参考

已经给出了非常详细的答案,但不知何故,他们没有提到这个简单的事实。

和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 。

例子:

  • 如果aA型, bB型,则(a, b)A x B ,这是一种产品types 。

  • 列表types的forms为NilCons x xs是一个总和types 。

Ensō显然比这些树状代数types更重视图。

从Coursera课程的讲义,大学提供的“编程语言”。 华盛顿:

“为什么是积和?这与布尔代数有关,其中0是错误的,1是真的,并且像乘法和或加法一样工作。