gpt4 book ai didi

clojure - 惰性序列——外部或内部的缺点

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

cons 应该在里面(lazy-seq ...)

(def lseq-in (lazy-seq (cons 1 (more-one))))

还是出去?

(def lseq-out (cons 1 (lazy-seq (more-one))))

我注意到了

(realized? lseq-in)
;;; ⇒ false

(realized? lseq-out)
;;; ⇒ <err>
;;; ClassCastException clojure.lang.Cons cannot be cast to clojure.lang.IPending clojure.core/realized? (core.clj:6773)

clojuredocs.org 上的所有示例使用“out”。

涉及哪些权衡?

最佳答案

您肯定希望将 (lazy-seq (cons ...)) 作为默认值,只有在有明确原因的情况下才可以偏离。 clojuredocs.org 很好,但是这些示例都是社区提供的,我不会称它们为“文档”。当然,它的构建方式的一个结果是,这些示例往往是由刚刚学会如何使用相关构造并希望提供帮助的人编写的,所以他们中的许多人都很穷。我会引用 clojure.core 中的代码或其他已知良好的代码。

为什么这应该是默认值?考虑 map 的这两个实现:

(defn map1 [f coll]
(when-let [s (seq coll)]
(cons (f (first s))
(lazy-seq (map1 f (rest coll))))))

(defn map2 [f coll]
(lazy-seq
(when-let [s (seq coll)]
(cons (f (first s))
(map2 f (rest coll))))))

如果您调用(map1 prn xs),则 xs 的元素将被实现并立即打印,即使您从未有意实现结果映射序列的元素。另一方面,map2 立即返回一个惰性序列,延迟其所有工作,直到请求一个元素。

关于clojure - 惰性序列——外部或内部的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012266/

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