问题描述
到目前为止,我只找到了向量和序列,但是它们都不能替换O(1)中列表的元素。这样的数据结构当然会违反Haskells结构的不变性,但是也许仍然存在一些肮脏的实现? 每个反馈都是欢迎的。
解决方法
正如您所建议的那样-我也很确定 O (1)中不可能进行安全,纯功能的更新。可能是在具有树状实现的 O (log n )中;例如,您可以将[a]
与连续的索引区域一起使用,而不是Data.Map.Map Int a
。此外,也可以仅在 O 中对列表或向量中的 k ≤ n 个元素进行批量更新。 em>( n )而不是 O ( k·n ),需要手动将它们一一插入。检出//
。
如果这些方法都不足够快,那么是的,您将需要进入可变性的黑暗领域。幸运的是,Haskell为此类旅行提供了良好的安全装甲和手电筒:ST
monad。它的工作方式是,在runST
中包装需要进行可变更新的整个区域。在该区域内,您使用MVector
来支持 O (1)mutable element updates,就像使用命令式语言一样。但是由于使用了类型系统技巧,runST
确保将所有这些副作用限制在本地范围内。