Haskell的标准队列包?

时间:2016-05-29 02:57:55

标签: haskell queue

Haskell是否有标准的队列实现?我看到几个相当成熟的优先级队列实现,但没有简单的队列。 Data.Sequence似乎没问题,但我认为我们可以通过更受限制的数据类型获得更好的性能。此外,限制操作(即,不是deque)可以防止错误从错误的一端出列。

编辑:

为了澄清,我希望有一个成熟的Haskell实现,最好是在Haskell平台或Hackage中。

2 个答案:

答案 0 :(得分:4)

Okasaki在他的书Purely Functional Data Structures中将FIFO队列描述为一对列表,,其中前列表包含前面的元素队列的顺序正确,后面的列表包含 reverse 顺序中队列的后面元素。

data Queue a = Queue [a] [a]  -- front & back lists

我们的想法是将新项目插入 back 列表的,而值则从前面列表中弹出。如果前面的列表变空,则会被后面列表的 reverse 替换。

只有当后面列表也为空时,队列才会保持前面列表可以为空的不变性;并执行摊销O(1)。

-- helper function to maintain the invariance:
-- front list can be empty only if the back list is also empty
fill :: Queue a -> Queue a
fill (Queue [] b) = Queue (reverse b) []
fill q = q

push :: a -> Queue a -> Queue a
push x (Queue f b) = fill $ Queue f (x:b)

front :: Queue a -> Maybe a
front (Queue (x:_) _) = Just x
front _               = Nothing

pop :: Queue a -> Maybe (Queue a)
pop (Queue (_:xs) b) = Just . fill $ Queue xs b
pop _                = Nothing

答案 1 :(得分:1)

Data.Queue已添加到ghc 6.4 [1]中的base,并在Data.Sequence包含时被ghc 6.6 [2]弃用。

从6.6发行说明:

  

有限序列有一个新模块Data.Sequence。现在不推荐使用Data.Queue模块,以支持更快,更有用的替换。

[1] https://downloads.haskell.org/~ghc/6.4/docs/html/users_guide/release-6-4.html

[2] https://downloads.haskell.org/~ghc/6.6/docs/html/users_guide/release-6-6.html