假设我有一个LazySeq
(def s(取10(迭代+ 0)))
(count s)
是否意识到序列?
答案 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
并非“聪明”,足以知道它的长度而没有意识到它的内容。