Sequence vs LazyList

pad*_*pad 16 f# sequence lazy-evaluation data-structures

我无法绕过序列和之间的差异LazyList.他们既懒惰又可能无限.虽然seq<'T>IEnumerable<'T>从.NET框架,LazyList包括在F#PowerPack中.在实践中,我比LazyLists 经常遇到序列.

它们在性能,使用情况,可读性等方面有何不同?LazyList与此相比,这种不良声誉的原因是seq什么?

Dan*_*iel 31

LazyList无论遍历列表的次数如何,每次只计算一次元素.通过这种方式,它更接近从Seq.cache(而不是典型序列)返回的序列.但是,除了缓存之外,LazyList其行为与列表完全相同:它使用了引擎盖下的列表结构并支持模式匹配.所以你可能会说:使用LazyList而不是seq当你需要列表语义和缓存(除了懒惰).

关于两者都是无限的,seq内存使用是恒定的,LazyList而是线性的.

这些文档可能值得一读.


Tom*_*cek 19

除了丹尼尔的回答,我认为主要的实际区别在于你如何处理LazyListseq结构(或计算).

  • 如果你想处理LazyList,你通常会使用模式匹配编写一个递归函数(非常类似于处理普通的F#列表)

  • 如果要处理seq,可以使用内置函数,也可以编写调用的命令式代码,GetEnumerator然后在循环中使用返回的枚举器(可以写为递归函数,但它会改变枚举器).您不能使用通常的头/尾样式(使用Seq.tailSeq.head),因为这样效率极低 - 因为seq不会保持评估的元素和Seq.head需要的结果从一开始就重新迭代.

有关的声誉seqLazyList,我认为F#库设计采取务实的态度-因为seq实际上是.NET IEnumerable,它是.NET编程比较方便(它也是很好的,因为你可以把其他收藏品的seq).懒惰列表不是那么频繁且常见的F#列表,seq并且在大多数情况下都足够了.