gpt4 book ai didi

functional-programming - 对惰性序列的评估感到困惑

转载 作者:行者123 更新时间:2023-12-04 12:19:06 26 4
gpt4 key购买 nike

我正在试验 clojure 的惰性序列。为了查看项目的评估何时发生,我创建了一个名为 square 的函数,该函数在返回结果之前打印结果。然后我使用 map 将此函数应用于向量。

(defn square [x]
(let [result (* x x)]
(println "printing " result)
result))

(def s (map square [1 2 3 4 5])) ; outputs nothing
在我的 s 声明中,REPL 不输出任何内容。这表示计算尚未开始。这似乎是正确的。然后我做:
(first s)
函数“first”只取第一项。所以我希望只有 1 会被评估。我的期望是 REPL 将输出以下内容:
printing 1
1
但是,REPL 改为输出以下内容。
printing 1
printing 4
printing 9
printing 16
printing 25
1
因此,它似乎不是只评估第一项,而是评估所有项,即使我只访问第一项。
如果惰性序列的状态只能是全计算和不计算值,那么它如何获得惰性求值的优势呢?我来自计划背景,我期待更像流的行为。看来我错了。任何人都可以解释发生了什么?

最佳答案

懒惰不是全有或全无,但 seq 的一些实现对输入序列的“块”进行操作(请参阅 here 以获得解释)。向量就是这种情况,您可以使用 chunked-seq? 进行测试。 :

(chunked-seq? (seq [1 2 3 4 5]))
当给一个集合时 map checks to see如果底层序列是分块的,如果是这样,则在每个块的基础上而不是一次评估一个元素的结果。
块大小通常为 32,因此您可以通过比较结果来查看此行为
(first (map square (vec (range 35))))
这应该只显示前 32 个项目的消息,而不是整个序列。

关于functional-programming - 对惰性序列的评估感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69648554/

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