gpt4 book ai didi

clojure - 惰性序列的不同元素何时在 clojure 中实现?

转载 作者:行者123 更新时间:2023-12-02 20:59:04 25 4
gpt4 key购买 nike

我试图了解 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 的开头,而无需意识到整个事情。这是怎么回事?

最佳答案

Clojure 的序列是惰性的,但为了提高效率,也进行了分块,一次实现 32 个结果的 block 。

=>(def lz-seq (map #(do (println (str "fn call " %)) (identity %)) (range 100)))
=>(first lz-seq)

fn call 0
fn call 1
...
fn call 31
0

一旦你首先跨越 32 边界,同样的事情就会发生

=>(nth lz-seq 33)
fn call 0
fn call 1
...
fn call 63
33

对于每次实现都需要完成大量工作的代码,Fogus给出了work around chunking的方法,并暗示可能正在进行控制分块的官方方法。

关于clojure - 惰性序列的不同元素何时在 clojure 中实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10750557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com