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

vik*_*ata 4 evaluation haskell list eager sequence

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

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

Mat*_*hid 11

列表类型是单链接列表.因此,前置,head并且tail都是O(1).但是,++O(n)是左侧列表的大小.

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

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

另请参阅Data.Sequence文档中的开头评论:

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

这里显然描述了基础算法.(特别是,包括一个很好的图表.)

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

  • `cons`,`snoc`,`head`和`last`对应的都是'Data.Sequence`的摊销*O(1)*. (4认同)
  • 另外,不是`Data.Sequence.Seq`一个手指树? (2认同)