当我们已经有列表时,为什么Haskell需要Data.Sequence?

时间:2016-02-25 09:28:25

标签: list haskell sequence evaluation eager

List是Haskell的默认数据类型,为什么我们仍然需要Data.Sequence? Data.Seq是否意味着可以随机访问的C样式数组?

如果是,我认为这意味着Data.Sequence存储有固定的内存缓冲区,因此,急切的评估类型。只是一个猜测,你会帮忙纠正吗?感谢。

1 个答案:

答案 0 :(得分:11)

列表类型是单链表。因此,前置,headtail都是O(1)。但是,++是左侧列表大小的O(n)。

相比之下,Data.Sequence是一个平衡树,因此大多数操作都是O(log n)。这不像O(1)那么快,但它的O(n)可能要快得多。换句话说,您可以比列表更快地连接序列,但前置稍慢。

除此之外,两种数据结构都具有非常相似的属性;他们都懒惰,他们都是参考透明的。 (序列必须是有限的。)

另见the documentation for Data.Sequence的开场白:

  

通用有限序列。除了有限且具有严格的操作之外,序列也不同于有效支持更广泛操作的列表。

基础算法显然是described here。 (特别是,包括一个很好的图表。)

如果您想要数组,则需要查看Data.Array和/或Data.Vector