我无法理解序列和LazyList之间的区别。他们都很懒惰,而且有无限的潜能。seq<'T>是来自.NET框架的IEnumerable<'T>,而LazyList则包含在F# PowerPack中。在实践中,我遇到的序列比LazyList的更多。
它们在性能、使用、可读性等方面有什么不同?与LazyList相比,seq__的声誉如此差的原因是什么?
发布于 2012-02-08 21:15:48
LazyList只计算每个元素一次,而不管列表被遍历了多少次。这样,它更接近于从Seq.cache返回的序列(而不是典型的序列)。但是,除了缓存之外,LazyList的行为与列表完全一样:它使用隐藏的列表结构,并支持模式匹配。因此,您可能会说:当您需要列表语义和缓存(除了懒惰之外)时,可以使用LazyList而不是seq。
对于两者都是无限的,seq的内存使用量是常数的,而LazyList的是线性的。
这些文档可能值得一读。
发布于 2012-02-08 23:30:03
除了Daniel的答案之外,我认为主要的实际差别是如何处理LazyList或seq结构(或计算)。
LazyList,通常使用模式匹配编写递归函数(非常类似于正常F#列表的处理)。seq,可以使用内置函数,也可以编写命令式代码,调用GetEnumerator,然后在循环中使用返回的枚举数(该枚举数可以编写为递归函数,但它将对枚举数进行变异)。您不能使用通常的头/尾样式(使用Seq.tail和Seq.head),因为这是非常低效率的,因为seq没有保留计算过的元素,Seq.head的结果需要从一开始就重新迭代。关于seq和LazyList的声誉,我认为F#库设计采用了一种务实的方法--因为seq实际上是.NET IEnumerable,所以对于.NET编程来说非常方便(而且它也很好,因为您可以将其他藏书视为seq)。惰性列表没有那么频繁,因此在大多数情况下,正常的F#列表和seq就足够了。
https://stackoverflow.com/questions/9201402
复制相似问题