haskell - Haskell 中可用的最佳(可变)队列数据结构

标签 haskell data-structures functional-programming queue mutable

亲爱的(est)堆栈交换器,

我目前正在实现一些需要访问“队列”(FIFO) 数据结构的算法。我正在使用 ST monad ,因此正在寻找与 ST monad 的“内存可变性”很好地互补的队列实现。在这一点上,我只是想在列表上使用 newSTRef (但是同样,访问最后一个元素是 O(n) 的复杂性,我想尽可能地避免这种情况。我也考虑过使用 Data.Sequence,但我不确定如果使用它是否真的是“可变的”在没有 newSTRef 初始化的 ST monad 中。

Stack Exchange 的好心人能否指导 Haskell 初学者在上述情况下最好的数据结构(或模块)是什么?

最佳答案

选项包括实现传统的 ring bufferSTArray 之上,或使用由 STRef 构建的可变单链表,如:

type CellRef s a = STRef s (Cell s a)
data Cell s a = End | Cell a (CellRef s a)
data Q s a = Q { readHead, writeHead :: CellRef s a }

如果您想要Q 的轻松增长但又喜欢环形缓冲区的低指针开销,您可以通过让每个单元格都有一个STArray 来获得中间立场慢慢填满。当它满了,分配一个新的单元格;当从中读取清空它时,前进到下一个单元格。你明白了。

关于haskell - Haskell 中可用的最佳(可变)队列数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69441612/

相关文章:

haskell - haskell中const函数的const函数

haskell - 我如何使用新的 cabal 生成 HTML 代码覆盖率报告?

haskell - 在 Haskell 中从 IO 中获取元素

java - 快速迭代具有 5100 万个素数的数据结构

C++图形构建问题

haskell - 寻找归纳定义树的叶子

java - 如何在 Java 中实现列表折叠

haskell - 这种自由(更自由?)单子(monad)的构造有效吗?

C++ 内存泄漏

haskell - 功能性镜片