我注意到,大多数功能语言都使用单链接列表(“ cons”列表)作为其最基本的列表类型。示例包括Common Lisp,Haskell和F#。这与主流语言不同,后者的本地列表类型是数组。
这是为什么?
对于Common Lisp(是动态键入的),我得到的想法是,缺点非常普遍,足以成为列表,树等的基础。这可能是一个微小的原因。
但是,对于静态类型的语言,我找不到很好的推理,甚至可以找到反参数:
- 功能性风格会促进不变性,因此链表的插入容易程度较弱,
- 功能风格鼓励不变性,因此也鼓励数据共享。数组比链表更容易“部分”共享,
- 您也可以对常规数组进行模式匹配,甚至更好(例如,您可以轻松地从右向左折叠),
- 最重要的是,您可以免费获得随机访问,
- 并且(一个实际的优势),如果该语言是静态类型的,则可以采用常规的内存布局并从高速缓存中提高速度。
那么为什么偏爱链表?
an array is easier to share "partially" than a linked list
需要澄清您的意思。由于它们具有递归特性,据我所知,事实恰恰相反-您可以通过传递列表中的任何节点来更轻松地部分共享链接列表,而数组则需要花费时间来制作新副本。或者,就数据共享而言,两个链接列表可以指向相同的后缀,而对于数组,这只是简单的。