【问题标题】:practical use of lazy sequences惰性序列的实际使用
【发布时间】:2019-08-03 13:46:48
【问题描述】:

通常我执行的序列操作,我总是使用doall 来实现它们。因此,我想知道惰性序列的实际用途是什么?

我在网上看到的所有使用惰性序列的示例都是用于构建 seq - (take 5 (range)) - 此代码也可以重写为 - (range 5) - 我的意思是所有 seq 生成都可以即使没有lazy seq也可以完成,那么他们的实际需求是什么?

我只看到了用于生成数字序列的惰性序列示例,还有其他应用程序吗?

【问题讨论】:

标签: clojure


【解决方案1】:

他们按需生成结果,并且可以在必要时停止生成。 这可以实现无限序列、处理的并行化、组合操作和避免临时存储(可以通过使用传感器进一步优化)

最后,惰性使得将递归算法转换为序列变得容易(使用lazy-seq

【讨论】:

  • 1) 您能否详细说明处理的并行化,如何通过使用惰性序列来实现? 2)你能举一个组合操作和避免临时存储的例子吗?
  • 您可以查看pmap 的源代码,它在惰性序列上并行化映射操作。实施起来很简单。懒惰的一些好处的一个很好的描述:clojure-doc.org/articles/language/…以及转换器:clojure.org/guides/faq#transducers_vs_seqs
【解决方案2】:

可以在tentacles library 中找到其中一个惰性 seq 示例(尽管我不确定它是否很棒)。

Eric Normand 还展示了 reading pages of data from a database 的示例,同时利用惰性序列,因此客户端只获取他们真正需要的页面。

附带说明:Programming Clojure 书(第 3 版,第 85 页)提到了以下使用惰性序列的准则:

  • 在生成大型或可变大小的序列时要偷懒。
  • 不要实现比你需要的更多的惰性序列
  • 使用递归 [即急切评估] 生成标量值或小的固定序列时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2014-11-10
    • 2016-09-19
    • 2011-06-26
    • 2014-03-09
    相关资源
    最近更新 更多