假设我有一个LazySeq:
(def s (take 10 (iterate + 0)))
(count s)
会实际计算该序列吗?
假设我有一个LazySeq:
(def s (take 10 (iterate + 0)))
(count s)
会实际计算该序列吗?
user> (def s (map #(do (println "doing work") %) (range 4)))
#'user/s
user> (count s)
doing work
doing work
doing work
doing work
4
一些数据结构可以在常数时间内给出答案,虽然惰性序列没有存储计数,并且计数总是使它们实现。
这取决于“惰性序列”的定义。可以实现知道它们长度但不会实现其元素的序列。有一个示例,请参见this question,但在99%的情况下,它们只是LazySeqs,因此Michiel的答案应该涵盖它们。
在您的示例中很容易进行测试,如下:
(realized? s)
(count s)
后返回 true
,因此 s
并不“聪明”到足以在意识到其内容的情况下知道其长度。realized?
这个东西。谢谢! - al3x