【问题标题】:Does `count` realize a lazy sequence in Clojure?`count` 是否在 Clojure 中实现了惰性序列?
【发布时间】:2013-09-10 21:18:35
【问题描述】:

假设我有一个 LazySeq

(def s (取10(迭代+0)))

(count s)是否实现了序列?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    如果你问的是惰性序列,是的。

    user> (def s (map #(do (println "doing work") %) (range 4)))
    #'user/s
    user> (count s)
    doing work
    doing work
    doing work                       
    doing work
    4  
    

    一些数据结构可以在恒定时间内给你答案,虽然惰性序列没有存储计数,并且计数总是实现它们

    【讨论】:

    • 第一次没有必要
    【解决方案2】:

    对于 LazySeq 是的,您可以查看其计数方法here。它从头到尾遍历每个元素。

    【讨论】:

      【解决方案3】:

      取决于惰性序列的定义。有可能实现那些知道它们的长度而不知道它们的元素。有关示例,请参阅 this question,但在 99% 的情况下,它们只是 LazySeqs,因此 Michiel 的回答应该涵盖这一点。

      在您的示例中,它很容易测试,如下所示:

      (realized? s) 
      

      在调用(count s) 后返回true,因此s 不够“聪明”,无法知道它的长度而没有意识到它的内容。

      【讨论】:

      • 哦,我不知道realized?。谢谢!
      猜你喜欢
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 2011-06-26
      相关资源
      最近更新 更多