在Clojure中,`count`函数是否实现了惰性序列?

9

假设我有一个LazySeq:

(def s (take 10 (iterate + 0)))

(count s)会实际计算该序列吗?

3个回答

6
如果您在询问关于惰性序列的问题,那么是的。
user> (def s (map #(do (println "doing work") %) (range 4)))
#'user/s
user> (count s)
doing work
doing work
doing work                       
doing work
4  

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


the first do isn't necessary - Michiel Borkent

4

对于LazySeq,你可以在这里看到它的count方法。它会从头到尾遍历每个元素。


1

这取决于“惰性序列”的定义。可以实现知道它们长度但不会实现其元素的序列。有一个示例,请参见this question,但在99%的情况下,它们只是LazySeqs,因此Michiel的答案应该涵盖它们。

在您的示例中很容易进行测试,如下:

(realized? s) 

在调用 (count s) 后返回 true,因此 s 并不“聪明”到足以在意识到其内容的情况下知道其长度。

哦,我不知道 realized? 这个东西。谢谢! - al3x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接