假设我有一个 LazySeq
(def s (取 10 (迭代 + 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
一些数据结构可以在恒定时间内给你答案,虽然惰性序列没有存储计数,并且计数总是实现它们。
对于 LazySeq 是的,您可以在此处查看其计数方法。它从头到尾遍历每个元素。
取决于惰性序列的定义。有可能实现那些知道它们的长度而不知道它们的元素。请参阅此问题作为示例,但在 99% 的情况下,它们只是 LazySeqs,因此 Michiel 的答案应该涵盖这一点。
在您的示例情况下,它很容易测试,如:
(realized? s)
true
在调用后返回(count s)
,所以s
在不知道它的内容的情况下知道它的长度还不够“聪明”。