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

sqd*_*sqd 0 haskell functional-programming

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

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

感谢您的帮助.


编辑:我们可以在这样的列表前面添加元素1:[2,3],这是push_front; 但是我们不能这样做:[2,3]:4那是push_back.

PS.实际上我从C++的STL借用了push_front/back

Sib*_*ibi 6

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

?> let x = [1,2,3]
?> x ++ [4]
[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,push_back的成本来自变量的持久性方面,您必须生成一个全新的列表,因为您无法修改旧列表. (2认同)