为什么在LazySeq上应用seq会返回ChunkedCons?

时间:2012-09-14 11:39:38

标签: clojure

(class (range 10))
;=> clojure.lang.LazySeq

(class (seq (range 10))
;=> clojure.lang.ChunkedCons

根据我的理解,LazySeq已经是一个序列,因为:

(seq? (range 10))
;=> true

2 个答案:

答案 0 :(得分:1)

扩展您的答案(因为评论不支持新行):

user=> (def r (range 10))
#'user/r
user=> (realized? r)
false
user=> (class r)
clojure.lang.LazySeq
user=> (def r2 (rest r))
#'user/r2
user=> (realized? r2)
ClassCastException clojure.lang.ChunkedCons cannot be cast to clojure.lang.IPending  clojure.core/realized? (core.clj:6607)
user=> (class r2)
clojure.lang.ChunkedCons
user=> (realized? r)
true

答案 1 :(得分:0)

我想我有一个答案。

这是因为使用seq强制评估LazySeq的第一个元素。因为seq在收集时会返回nil& sequence是空的,它必须评估元素来决定。

这就是restnext更懒惰的原因,因为(next s)只是(seq (rest s))