recent blog post on William Cook's Fusings提及:
关键在于Ensō中的结构被整体地视为图形,而不是单个值或传统的和产品数据结构。
他所指的传统的产品和产品数据结构是什么?
答案 0 :(得分:88)
他所指的传统的产品和产品数据结构是什么?
在类型理论中,常规数据结构可以用总和,产品和递归类型来描述。这导致用于描述数据结构的代数(以及所谓的代数数据类型)。这种数据类型在静态类型的函数语言中很常见,例如ML或Haskell。
<强>产品强>
产品可以被认为是“结构”或“元组”的类型理论视图。
正式,PFPL,第14章:
两种类型的二进制产品由有序的值对组成,其中一对来自 每种类型都按照指定的顺序排列。相关的消除形式是投影,它选择一对的第一和第二组成部分。 nullary产品或单位类型仅由没有值的唯一“null元组”组成,并且没有相关的消除形式。
<强>和的强>
Sum类型表示数据结构变体之间的选择。有时它们被称为“联合类型”(如在C中)。许多语言都没有和类型的概念。
PFPL,第15章:
大多数数据结构都涉及诸如a之间区别的替代方案 叶子和树中的内部节点,或者最外层形式的选择 一块抽象的语法。重要的是,选择决定了结构 的价值。例如,节点有子节点,但叶子没有,等等 向前。这些概念由和类型表示,特别是二进制 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)
一个简单的和类型,data Maybe a = Nothing | Just a
及其替代方案,
和递归类型,链接列表的类型:data [a] = [] | a : [a]
鉴于这些,您可以通过组合总和,产品和递归类型来构建相当复杂的结构。
例如。产品总和产品清单的简单表示法:[(Maybe ([Char], Double), Integer)]
会产生一些相当复杂的树:
参考
答案 1 :(得分:35)
已经给出了非常详细的答案,但不知怎的,他们没有提到这个简单的事实。
调用求和类型是因为求和类型的可能值的数量是两个基础类型的值数量的和。 类似地,对于产品类型,可能的值的数量是产品。
这源于类型理论将类型定义为一组值。
data MySumType = Foo Bool | Bar Char
data MyProductType = Baz (Bool, Char)
现在你永远不会忘记哪个是哪个。
答案 2 :(得分:5)
他指的是函数式编程语言的标准algebraic data types。
示例:
如果a
的类型为A
且b
的类型为B
,则(a, b)
的类型为A x B
,其中是product type。
包含Nil
或Cons x xs
形式值的列表类型为sum type。
Ensō显然比这些类似树的代数类型更重视图形。
答案 3 :(得分:1)
来自大学课程的讲义,&#34;编程语言&#34;,由大学提供。华盛顿:
&#34;为什么产品和总和?这与布尔代数中的事实有关,其中0为假,1为真,并且像乘法一样工作,或者像加法一样工作。&#34;