什么是归纳定义的数据类型?

What is an inductively defined data type?

提问人:Mario Galic 提问时间:5/3/2018 更新时间:5/5/2018 访问量:875

问:

归纳数据类型有哪些示例?电感类型与非电感类型有何不同?他们能做些什么,否则是不可能的?什么时候不应该使用它们?

任何语言的代码片段将不胜感激。

类型 函数式编程 与语言无关 术语 归纳

评论

0赞 duggi 5/3/2018
您是否正在寻找递归数据类型或代数数据类型(可能不是递归数据类型)?
0赞 Mario Galic 5/3/2018
@duggi 我不确定 - 我的印象是术语归纳数据类型、递归数据类型和代数数据类型都是同义词。
0赞 Ignacio Tiraboschi 5/4/2018
@MarioGalic递归数据类型归纳数据类型是相同的,至少在我看来是这样。但是代数数据类型是不同的。例如,元组是一种代数数据类型,因为它采用某种类型的值(通常不是元组),即类型的组合。但自然数可能是归纳类型的一个例子。

答:

3赞 Aaron M. Eshbach 5/4/2018 #1

归纳数据类型只是根据自身定义的数据类型。一个简单的例子是一个列表,我们可以将其定义为:

type List<'a> =
| Empty
| List of 'a * List<'a>

因此,列表要么是空的,要么具有头部节点和尾部,尾部本身就是一个列表。这允许我们以一种非常简单的方式定义一个列表,而没有任何其他内置的数据结构(除了元组类型,但我们可以不这样做,它只是简化了示例)。

然后,我们可以创建一个简单的函数来添加到列表中,例如:

let add item = function
| Empty -> List (item, Empty)
| List (head, tail) -> List (item, (List (head, tail)))

这将一个项目和一个列表作为输入,并返回一个新列表。如果输入列表为空,则返回一个列表,其中项目为头部,空列表为尾部。如果列表不为空,则返回一个新列表,其中项为头部,原始列表为尾部。

我们可以使用此函数来构建任何类型的列表。对于整数,这看起来像:

Empty 
|> add 1
|> add 2
|> add 3

其中 是一个运算符,它采用前面的值并将其作为最后一个参数传递给下一个函数。这给了我们一个列表:|>

List<int> = List (3,List (2,List (1,Empty)))

至于何时不应该使用它们,在某些情况下,递归定义的数据结构可能会相对于可变状态数组产生性能或内存损失。这通常是由于底层系统实现基于更紧密地反映数组的结构。但是,根据用例的不同,维护可变状态数组可能会产生其他惩罚,例如并发应用程序中的锁定管理。如果你对更详细的分析感兴趣,我强烈推荐《纯函数式数据结构》一书。