gpt4 book ai didi

clojure - 如何在不强制实现的情况下找到惰性序列的长度?

转载 作者:行者123 更新时间:2023-12-03 00:34:48 25 4
gpt4 key购买 nike

我目前正在阅读 O'reilly Clojure 编程书,其中有关惰性序列的部分提到了以下内容:

It is possible (though very rare) for a lazy sequence to know its length, and therefore return it as the result of count without realizing its contents.

我的问题是,这是如何完成的以及为什么如此罕见?

不幸的是,本书在本节中没有具体说明这些内容。我个人认为,在实现之前了解惰性序列的长度非常有用,例如,在同一页面中是一个使用 map 函数处理的文件惰性序列的示例。如果能知道在实现序列之前可以处理多少个文件,那就太好了。

最佳答案

受到 soulcheck's answer 的启发,这是固定大小集合上昂贵函数的惰性但计数的映射。

(defn foo [s f] 
(let [c (count s), res (map f s)]
(reify
clojure.lang.ISeq
(seq [_] res)
clojure.lang.Counted
(count [_] c)
clojure.lang.IPending
(isRealized [_] (realized? res)))))


(def bar (foo (range 5) (fn [x] (Thread/sleep 1000) (inc x))))

(time (count bar))
;=> "Elapsed time: 0.016848 msecs"
; 5

(realized? bar)
;=> false


(time (into [] bar))
;=> "Elapsed time: 4996.398302 msecs"
; [1 2 3 4 5]

(realized? bar)
;=> true

(time (into [] bar))
;=> "Elapsed time: 0.042735 msecs"
; [1 2 3 4 5]

关于clojure - 如何在不强制实现的情况下找到惰性序列的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471607/

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