是否有类似于Haskell中列表的数据结构,允许替换O(1)中的元素?

是否有类似于Haskell中列表的数据结构,允许替换O(1)中的元素?,haskell,data-structures,Haskell,Data Structures,到目前为止,我只找到了向量和序列,但它们都不能替换O(1)中列表的元素。这样的数据结构当然会违反Haskell结构的不变特性,但可能仍然存在一些肮脏的实现? 每个反馈都是很好的。正如您自己所建议的那样–我也非常确定在O(1)中进行安全、纯粹的功能更新是不可能的。可能的是O(logn)中的树型实现;例如,您可以使用带有连续索引区域的Data.Map.Map inta来代替[a]。此外,还可以批量更新k≤ 列表或向量中的n个元素,手动逐个插入它们只需O(n)而不是O(k·n)。退房 如果这些对你来说

到目前为止,我只找到了向量和序列,但它们都不能替换O(1)中列表的元素。这样的数据结构当然会违反Haskell结构的不变特性,但可能仍然存在一些肮脏的实现?
每个反馈都是很好的。

正如您自己所建议的那样–我也非常确定在O(1)中进行安全、纯粹的功能更新是不可能的。可能的是O(logn)中的树型实现;例如,您可以使用带有连续索引区域的
Data.Map.Map inta
来代替
[a]
。此外,还可以批量更新k≤ 列表或向量中的n个元素,手动逐个插入它们只需O(n)而不是O(k·n)。退房


如果这些对你来说都不够快,那么是的,你将需要进入可变性的黑暗领域。幸运的是,哈斯凯尔为这种旅行提供了一种很好的安全盔甲和手电筒。它的工作方式是,将需要进行可变更新的整个区域包装起来。在该区域内,您可以使用支持O(1)的s,就像在命令式语言中一样。但是多亏了类型系统技巧,
runST
确保所有这些副作用都局限在局部范围内。

这是否回答了您的问题<代码>数据。矢量是首先查看的好地方。也有一个可变版本。re“O(1)中的安全、纯功能更新”,当它本质上是唯一使用的,比如在尾部递归工作函数的尾部调用中,为什么编译
a//xs
以使它花费
O(| xs |)
时间是非法的?我意识到对于编译器/解释器来说,这是一个非常狭隘的特殊情况,但是。。。。(也许懒惰会让事情变得更难…@意志力好吧,这是一个特例,很多人会发现它非常有用。如果没有人试图实现这一点,我会感到惊讶;在某些情况下,vector+GHC可能会将其融合到O(|
xs
|)中。只是,在那些重写很明显的情况下,您可能还可以使用向量库中的其他纯功能工具来达到目标,这些工具保证具有良好的复杂性。在更复杂的例子中,我不相信重写规则,也不相信那些运行速度较慢但复杂度更高的代码没有经过充分优化。。。无聊的。