Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell的标准队列包?_Haskell_Queue - Fatal编程技术网

Haskell的标准队列包?

Haskell的标准队列包?,haskell,queue,Haskell,Queue,Haskell是否有标准的队列实现?我看到了几个相当成熟的优先级队列实现,但没有简单的队列。Sequence看起来还可以,但我认为我们可以用更严格的数据类型获得更好的性能。此外,限制操作(即,不是deque)可以防止bug从错误的一端退出队列 编辑: 为了澄清,我希望有一个成熟的Haskell实现,最好是在Haskell平台或Hackage中实现 冈崎在他的书中将FIFO队列描述为一对前后列表,其中前列表按正确顺序包含队列的前元素,后列表按相反顺序包含队列的后元素 其思想是将新项目插入到后面列表

Haskell是否有标准的队列实现?我看到了几个相当成熟的优先级队列实现,但没有简单的队列。Sequence看起来还可以,但我认为我们可以用更严格的数据类型获得更好的性能。此外,限制操作(即,不是deque)可以防止bug从错误的一端退出队列

编辑:

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

冈崎在他的书中将FIFO队列描述为一对前后列表,其中前列表按正确顺序包含队列的前元素,后列表按相反顺序包含队列的后元素

其思想是将新项目插入到后面列表的前面,而值则从前面列表中弹出。如果前面的列表变为空,它将被后面列表的相反部分替换

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


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

从6.6发行说明中:

有一个新的模块数据。序列为有限序列。现在,Data.Queue模块已被弃用,取而代之的是这种更快、更具特色的替换

[1]


[2]

尽管StackOverflow完全脱离主题,但这是一个极好的问题。您确实可以从更受限制的类型中获得更好的性能。贝扎德·努里(behzad.nouri)提出的简单的“银行家队列”在队列不太大时非常有用。一旦你推到缓存大小,它开始看起来很糟糕。如果性能非常重要,您可能需要考虑奇特的高速缓存忽略队列。否则,我想你可能会喜欢冈崎的手指树风格的“隐式队列”;我想知道我是否在搜索中漏掉了一些明显的东西(例如,对于C++,答案是STD::队列)。可能最好的答案只是数据。顺序,或者“不,这样的包不存在。”我更新了我的问题,使之更加客观。有很多种队列具有不同的性能特征、功能等。您是否在寻找持久性队列?一元短暂队列?偶尔持续使用的队列?并发线程之间通信的队列?是的,持久队列。我在GHC发行说明中找到了答案,请参见下面的答案。当然,但我正在寻找一个成熟的Haskell实现,最好是在Haskell平台或Hackage中。该版本的队列不是我认为的银行家队列。如果长期使用,队列的性能可能会非常差。@dfeur…但是,公平地说,长期队列是一个非常小的需求。
Data.Sequence
在需要大量合理有效的操作时非常有趣(我目前主要负责维护它,所以我对它的好的和坏的特性有相当不错的感觉)。但是,如果你能侥幸逃脱的话,使用一种不太灵活的结构,你会做得更好。
Data.Sequence
必须维护大小注释以支持拆分,需要支持多个内部节点大小和额外的“数字”支持连接的大小等。如果您仅少量使用持久性,则最好使用更大的节点。如果您存储的是不可伸缩类型,则可以在树中使用不可伸缩向量来让事情变得非常尖锐。没有一个队列可以对它们进行全部管理。感谢您的建议;如果/当我遇到performa时,我会记住这一点nce问题。也就是说,了解
数据是很好的。序列对于一般使用来说是合理的,因为不编写和调试自定义队列可能比效率成本节省更多的时间(正如您在对behzad.nouri的回答的评论中指出的,很容易犯一些微妙的错误,从而大大降低效率)@Dfeu是否希望添加基于索引的插入和删除?@Alan,为了StackOverflow的后代,知道下一个版本的
Data.Sequence
将提供
insertAt
deleteAt
,每一个都比拆分和重新加入快几倍。
data Queue a = Queue [a] [a]  -- front & back lists
-- 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