如何解决是否有类似于Haskell中的列表的数据结构,该结构允许替换O1中的元素?
到目前为止,我只找到了向量和序列,但是它们都不能替换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
确保将所有这些副作用限制在本地范围内。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。