【发布时间】:2021-10-04 19:47:00
【问题描述】:
尊敬的堆栈交换员,
我目前正在实现一些需要访问“队列”(FIFO)数据结构的算法。我正在使用 ST monad ,因此我正在寻找与 ST monad 的“内存可变性”相辅相成的队列实现。此时,我只是想在列表上使用 newSTRef (但同样,访问最后一个element 是 O(n) 复杂性,我想尽可能避免)。我也想过使用 Data.Sequence,但我不确定如果在 ST monad 中使用它是否真的会“可变” newSTRef 初始化。
Stack Exchange 的好心成员能否指导 Haskell 的初学者在上述情况下什么是最好的数据结构(或模块)?
【问题讨论】:
-
使用指针和可变变量访问最后一个单元格是 O(1),如果您维护指向它的指针。并在您扩大(或缩小)列表时对其进行更新。
-
哎呀!我需要在 Haskell 中查看指针!它们与这个 ST monad 是否特别兼容?
-
Data.STRef 说它是“(严格)ST monad 中的可变引用。”。引用是一个“指针”。一个 STRef 可以在其中包含另一个 STRef。当保存的 STRef 更新时,我们稍后检索它,检索到的 STRef 也会更新。因此它就像一个指针。你可以用它们重新实现列表,“节点”持有指向其他“节点”的“指针”。 --- 例如
runST $ do { x <- newSTRef 11; xr <- newSTRef x; z <- writeSTRef x 8; x2 <- readSTRef xr; y <- read STRef x2, return y }返回8。
标签: haskell data-structures functional-programming queue mutable