Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:list的底层数据结构是什么?_Haskell_Functional Programming - Fatal编程技术网

Haskell:list的底层数据结构是什么?

Haskell:list的底层数据结构是什么?,haskell,functional-programming,Haskell,Functional Programming,如果是链表,为什么不支持push_back 如果它只是一个数组,为什么它在被下标访问时需要线性时间 谢谢你的帮助 编辑:我们可以在列表前面添加元素,如1:[2,3],这是push_front;但我们不能这样做:[2,3]:4,这是推回 实际上我借用了C++的STL中的push_front/back,Haskell列表是单链接列表。它支持追加到列表的末尾,但必须遍历整个列表才能执行此操作: λ> let x = [1,2,3] λ> x ++ [4] [1,2,3,4] 如果push

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

如果它只是一个数组,为什么它在被下标访问时需要线性时间

谢谢你的帮助

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


实际上我借用了C++的STL中的push_front/back,Haskell列表是单链接列表。它支持追加到列表的末尾,但必须遍历整个列表才能执行此操作:

λ> let x = [1,2,3]
λ> x ++ [4]
[1,2,3,4]
如果push_back的意思是在末尾添加一个元素,那么它当然支持它。要将元素x添加到列表中并获得这样构造的新列表,请使用表达式list++[x]

不过要注意,这是一个On操作,n是列表的长度


这是因为它是一个单链表。它还回答了您关于subscript的其他问题。

因为该问题询问的是底层实现:

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

data [a] = [] | a:[a]
您实际上无法编写此声明,因为列表具有时髦的语法。但是你可以自己做完全一样的东西

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

当您编写类似于[1,2,3]的东西时,这只是1:2:3:[]的特殊语法。因为:关联到右边,这实际上意味着1:2:3:[]。列表上的函数基本上都基于模式匹配,一次只处理一个构造函数。您可能需要打开许多:构造函数才能到达列表的末尾,然后构建一组:构造函数来组合一个新版本,并在末尾添加一个额外的元素。您可能使用的任何函数(如+)最终都会在内部经历这种过程。

我怀疑这是一个链表,但我不确定push\u back是什么。你能解释一下吗?Haskell列表是单链表。正如@黑菜说的,PASHEBACK是什么意思?我相信C++列表是双重链接的,而哈斯克尔的列表是单链的,所以只有添加到前面才是有效的。感谢您的帮助。您可能想看看哪些支持摊销O1 pushBack和pushFront。需要注意的是,push_back的成本来自变量的持久性方面,您必须生成一个全新的列表,因为您无法修改旧列表。