首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列与LazyList

序列与LazyList
EN

Stack Overflow用户
提问于 2012-02-08 21:05:31
回答 2查看 3.4K关注 0票数 16

我无法理解序列和LazyList之间的区别。他们都很懒惰,而且有无限的潜能。seq<'T>是来自.NET框架的IEnumerable<'T>,而LazyList则包含在F# PowerPack中。在实践中,我遇到的序列比LazyList的更多。

它们在性能、使用、可读性等方面有什么不同?与LazyList相比,seq__的声誉如此差的原因是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-08 21:15:48

LazyList只计算每个元素一次,而不管列表被遍历了多少次。这样,它更接近于从Seq.cache返回的序列(而不是典型的序列)。但是,除了缓存之外,LazyList的行为与列表完全一样:它使用隐藏的列表结构,并支持模式匹配。因此,您可能会说:当您需要列表语义和缓存(除了懒惰之外)时,可以使用LazyList而不是seq

对于两者都是无限的,seq的内存使用量是常数的,而LazyList的是线性的。

这些文档可能值得一读。

票数 31
EN

Stack Overflow用户

发布于 2012-02-08 23:30:03

除了Daniel的答案之外,我认为主要的实际差别是如何处理LazyListseq结构(或计算)。

  • 如果要处理LazyList,通常使用模式匹配编写递归函数(非常类似于正常F#列表的处理)。
  • 如果要处理seq,可以使用内置函数,也可以编写命令式代码,调用GetEnumerator,然后在循环中使用返回的枚举数(该枚举数可以编写为递归函数,但它将对枚举数进行变异)。您不能使用通常的头/尾样式(使用Seq.tailSeq.head),因为这是非常低效率的,因为seq没有保留计算过的元素,Seq.head的结果需要从一开始就重新迭代。

关于seqLazyList的声誉,我认为F#库设计采用了一种务实的方法--因为seq实际上是.NET IEnumerable,所以对于.NET编程来说非常方便(而且它也很好,因为您可以将其他藏书视为seq)。惰性列表没有那么频繁,因此在大多数情况下,正常的F#列表和seq就足够了。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9201402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档