Data structures Cons的优点是什么?

Data structures Cons的优点是什么?,data-structures,functional-programming,Data Structures,Functional Programming,许多函数式编程语言支持并推荐数据构造函数Cons(用于(1,(2,(3)),如和 但是它的优点是什么呢?这样的列表既不能随机访问,也不能附加到O(1)Cons(construct的缩写)不是数据结构,而是用于创建cons单元格的操作的名称。通过将多个单元格链接在一起,可以构建一个数据结构,特别是一个链表。其余讨论假设正在使用cons操作创建链表 虽然可以在头上附加O(1),但通过索引随机访问元素是一项代价高昂的操作,这需要在访问的元素之前遍历所有元素 链表的优点?它是一种功能性数据结构,在修改时

许多函数式编程语言支持并推荐数据构造函数
Cons
(用于
(1,(2,(3))
,如和

但是它的优点是什么呢?这样的列表既不能随机访问,也不能附加到
O(1)

Cons
(construct的缩写)不是数据结构,而是用于创建cons单元格的操作的名称。通过将多个单元格链接在一起,可以构建一个数据结构,特别是一个链表。其余讨论假设正在使用
cons
操作创建链表

虽然可以在头上附加O(1),但通过索引随机访问元素是一项代价高昂的操作,这需要在访问的元素之前遍历所有元素


链表的优点?它是一种功能性数据结构,在修改时创建或重新创建成本低廉;它允许在多个列表之间共享节点,并允许轻松进行垃圾收集。它非常灵活,具有正确的抽象,可以表示其他更复杂的数据结构,如堆栈、队列和树s、 还有很多很多专门为操作列表而编写的程序,例如
map
filter
fold
,等等,这些都使使用列表成为一种乐趣。最后,列表是一种递归数据结构,递归(特别是尾部递归)是函数式编程语言中解决问题的首选方法;因此在这些语言中,递归数据结构作为主要数据结构是很自然的。

首先,让我们区分“cons”作为通常称为
的ML样式列表数据构造函数的昵称,以及昵称的来源,原始的Lisp样式
cons
函数

在Lisps中,cons单元格是一种通用数据结构,不限于同构元素类型的列表。在ML风格的语言中,等价物是嵌套对或2元组,空列表由“unit”类型表示,通常为
()
.Óscar López很好地概述了Lisp
cons
的实用性,所以我就到此为止

在大多数ML风格的语言中,不可变cons列表的优点与它们在Lisps中的列表使用没有太大的区别,在保证静态类型和ML风格模式匹配语法的同时,牺牲了动态类型的灵活性

然而,在Haskell中,由于延迟求值,情况就大不相同了。构造函数是延迟的,对它们进行模式匹配是强制求值的少数几种方法之一,因此与严格求值的语言相比,通常情况下应该避免尾部递归。相反,通过将递归调用放在列表的尾部,它可以只有在需要时才可以计算每个递归调用。如果使用适当的延迟函数(如
map
foldr
)处理延迟生成的列表,则可以在恒定内存中构造和使用一个大的列表,并以相同的速率强制尾部,以便GC清除头部起来

Haskell的一个常见观点是,惰性cons列表与其说是一个数据结构,不如说是一个控制结构——一个与其他类似循环有效组合的具体化循环


这就是说,在许多情况下,缺点列表并不合适——比如需要重复随机访问时——在这些情况下,当然不建议使用列表。

优势到底是什么?通常当你谈论优点时,它们都超越了一些可供选择的方法。实际上,OP似乎在使用“缺点”在函数式编程的ML传统中,术语“数据构造函数”是正确的。在这种情况下,数据构造函数同时充当“cons cell”的定义,创建列表的操作,以及用于提取现有列表的开头和结尾的模式。此外,在这些语言中,它通常是列表专有的,而不是lisps中的通用构建块。