9

假设我有一个 LazySeq

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

是否(count s)实现顺序?

4

3 回答 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  

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

于 2013-09-10T21:24:40.200 回答
4

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

于 2013-09-10T21:27:39.170 回答
1

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

在您的示例情况下,它很容易测试,如:

(realized? s) 

true在调用后返回(count s),所以s在不知道它的内容的情况下知道它的长度还不够“聪明”。

于 2013-09-10T21:22:20.040 回答