Haskell是否有标准的队列实现?我看到几个相当成熟的优先级队列实现,但没有简单的队列。 Data.Sequence似乎没问题,但我认为我们可以通过更受限制的数据类型获得更好的性能。此外,限制操作(即,不是deque)可以防止错误从错误的一端出列。
编辑:
为了澄清,我希望有一个成熟的Haskell实现,最好是在Haskell平台或Hackage中。
答案 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