提问人:Mario Galic 提问时间:5/3/2018 更新时间:5/5/2018 访问量:875
什么是归纳定义的数据类型?
What is an inductively defined data type?
答:
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)))
至于何时不应该使用它们,在某些情况下,递归定义的数据结构可能会相对于可变状态数组产生性能或内存损失。这通常是由于底层系统实现基于更紧密地反映数组的结构。但是,根据用例的不同,维护可变状态数组可能会产生其他惩罚,例如并发应用程序中的锁定管理。如果你对更详细的分析感兴趣,我强烈推荐《纯函数式数据结构》一书。
上一个:术语“无符号整数”从何而来?
下一个:“flatMap”一词从何而来?
评论