【发布时间】:2012-05-25 07:49:05
【问题描述】:
我试图了解 clojure 的惰性序列何时是惰性的,工作何时发生,以及我如何影响这些事情。
user=> (def lz-seq (map #(do (println "fn call!") (identity %)) (range 4)))
#'user/lz-seq
user=> (let [[a b] lz-seq])
fn call!
fn call!
fn call!
fn call!
nil
我希望在这里只看到两个“fn call!”。有没有办法管理它? 无论如何,继续进行毫无疑问只需要一次评估的事情:
user=> (def lz-seq (map #(do (println "fn call!") (identity %)) (range 4)))
#'user/lz-seq
user=> (first lz-seq)
fn call!
fn call!
fn call!
fn call!
0
first 不适合惰性序列吗?
user=> (def lz-seq (map #(do (println "fn call!") (identity %)) (range 4)))
#'user/lz-seq
user=> (take 1 lz-seq)
(fn call!
fn call!
fn call!
fn call!
0)
在这一点上,我完全不知道如何访问我的玩具 lz-seq 的开头,而不必了解整个事情。怎么回事?
【问题讨论】:
-
只是一个小评论:
map不应该带一个有副作用的函数,否则,你可能会收到意想不到的行为。每当您需要产生一些副作用时,请改用doseq。