`count`在Clojure中实现了一个懒惰的序列吗?

时间:2013-09-10 21:18:35

标签: clojure

假设我有一个LazySeq

  

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

(count s)是否意识到序列?

3 个答案:

答案 0 :(得分:5)

如果您询问延迟序列,可以。

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

一些数据结构可以在恒定时间内给出答案,尽管延迟序列没有存储计数,计数总是实现它们

答案 1 :(得分:3)

对于LazySeq是的,你可以看到它的计数方法here。它从头到尾散布每一个元素。

答案 2 :(得分:1)

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

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

(realized? s) 

在致电true后返回(count s),因此s并非“聪明”,足以知道它的长度而没有意识到它的内容。