【问题标题】:What are "sums-and-products" data structures?什么是“sums-and-products”数据结构?
【发布时间】: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


【解决方案1】:

他指的是什么传统的 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 堆中的数据结构生成的。
  • 太棒了。感谢您的参考。
  • 还有这个演讲直观地解释了这个话题:youtube.com/watch?v=YScIPA8RbVE
【解决方案2】:

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

之所以这样称呼求和类型,是因为求和类型的可能值的数量是两个基础类型的值数量的总和。 同样对于产品类型,可能值的数量是产品。

这源于将类型定义为一组值的类型理论。

data MySumType = Foo Bool | Bar Char
data MyProductType = Baz (Bool, Char)
  • Bool 是一组 2 个值。
  • Char 是一组 256 个值。
  • MySumType 是一组 2 + 256 个值。
  • MyProductType 是一组 2 * 256 个值。

现在你永远不会忘记哪个是哪个。

【讨论】:

  • 这是有史以来最直观的答案!
【解决方案3】:

他指的是函数式编程语言的标准algebraic data types

例子:

  • 如果aA 类型,而bB 类型,那么(a, b)A x B 类型,即product type

    李>
  • 具有NilCons x xs 形式的值的列表类型是sum type

Ensō 显然比这些树状代数类型更强调图形。

【讨论】:

    【解决方案4】:

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

    “为什么要乘积和求和?这与布尔代数中 0 为假而 1 为真,其工作方式类似于乘法或或类似加法的事实有关。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 2015-12-09
      • 2018-01-27
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多