【发布时间】:2013-09-10 21:18:35
【问题描述】:
假设我有一个 LazySeq
(def s (取10(迭代+0)))
(count s)是否实现了序列?
【问题讨论】:
标签: clojure
假设我有一个 LazySeq
(def s (取10(迭代+0)))
(count s)是否实现了序列?
【问题讨论】:
标签: clojure
如果你问的是惰性序列,是的。
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 是的,您可以查看其计数方法here。它从头到尾遍历每个元素。
【讨论】:
取决于惰性序列的定义。有可能实现那些知道它们的长度而不知道它们的元素。有关示例,请参阅 this question,但在 99% 的情况下,它们只是 LazySeqs,因此 Michiel 的回答应该涵盖这一点。
在您的示例中,它很容易测试,如下所示:
(realized? s)
在调用(count s) 后返回true,因此s 不够“聪明”,无法知道它的长度而没有意识到它的内容。
【讨论】:
realized?。谢谢!