如果是链接列表,为什么它不支持push_back?
如果它只是数组,为什么在下标时需要线性时间?
感谢您的帮助。
编辑:我们可以将元素添加到像1:[2,3]
这样的列表前面,即推送前端;但是我们不能这样做:[2,3]:4
,这就是推送。
PS。实际上我从C ++的STL
借用了push_front / back答案 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:[]))
。列表上的函数基本上都是基于模式匹配,它一次只处理一个构造函数。您可能必须打开许多:
构造函数才能到达列表的末尾,然后构建一堆:
构造函数,以便在最后将一个带有额外元素的新版本组合在一起。您可能使用的任何函数(如++
)最终将在内部执行此类过程。