Haskell:列表的基础数据结构是什么?

时间:2015-02-17 14:37:52

标签: haskell functional-programming

如果是链接列表,为什么它不支持push_back?

如果它只是数组,为什么在下标时需要线性时间?

感谢您的帮助。


编辑:我们可以将元素添加到像1:[2,3]这样的列表前面,即推送前端;但是我们不能这样做:[2,3]:4,这就是推送。

PS。实际上我从C ++的STL

借用了push_front / back

3 个答案:

答案 0 :(得分:6)

Haskell列表是单链表。它支持追加到列表的末尾,但它必须遍历此操作的整个列表。:

λ> let x = [1,2,3]
λ> x ++ [4]
[1,2,3,4]

答案 1 :(得分:3)

如果通过push_back你的意思是在最后添加一个元素,当然它"支持"它。要将元素x添加到列表list(并获取如此构造的新列表),请使用表达式list ++ [x]

请注意,这是一个O(n)操作,n是list的长度。

那是因为它是一个单链表。它还回答了关于下标的其他问题。

答案 2 :(得分:0)

由于问题是关于“底层实施”:

列表类型(概念上)定义如下:

data [a] = [] | a:[a]

您实际上无法编写此声明,因为列表具有时髦的语法。但你可以自己制作完全相同的东西

data List a = Nil | a :* List a
infixr 5 :*

当你写[1,2,3]之类的内容时,这只是1:2:3:[]的特殊语法。由于:与右侧相关联,这实际上意味着1:(2:(3:[]))。列表上的函数基本上都是基于模式匹配,它一次只处理一个构造函数。您可能必须打开许多:构造函数才能到达列表的末尾,然后构建一堆:构造函数,以便在最后将一个带有额外元素的新版本组合在一起。您可能使用的任何函数(如++)最终将在内部执行此类过程。