【发布时间】:2021-12-07 10:13:53
【问题描述】:
我正在试验 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
因此,它似乎评估了所有项目,而不是只评估第一项,即使我只访问第一项。
如果惰性序列的状态只能是所有计算值和没有计算值,那么它如何获得惰性求值的优势?我来自计划背景,我期待更像流的行为。看来我弄错了。谁能解释一下是怎么回事?
【问题讨论】:
标签: functional-programming clojure lazy-evaluation