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

What is an inductively defined data type?

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

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

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

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)))

这需要一个项目和一个列表作为输入,returns 一个新列表。如果输入列表为空,则它 returns 一个以项目为头、空列表为尾的列表。如果列表不为空,则 returns 一个新列表,该项目作为头部,原始列表作为尾部。

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

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

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

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

至于何时不应使用它们,在某些情况下,递归定义的数据结构可能会导致性能或内存损失,例如,可变状态数组。这通常是由于底层系统实现基于更接近数组镜像的结构。但是,根据用例,维护可变状态数组可能会招致其他惩罚,例如并发应用程序中的锁管理。如果您对更详细的分析感兴趣,我强烈推荐这本书 Purely Functional Data Structures