【问题标题】:laziness does not work as expected懒惰没有按预期工作
【发布时间】:2013-02-22 10:56:41
【问题描述】:
(defn seq-trial
[]
(map #(do (println "hello " %) (inc %)) (range 10)))
(take 3 (seq-trial))
上面的代码片段在评估时会打印出以下内容 -
(你好 0
你好 1
你好 2
你好 3
你好 4
你好 5
你好 6
你好 7
你好 8
你好 9
1 2 3)
因为 map 返回一个惰性序列,我希望它只打印 -
(你好 0
你好 1
你好 2
1 2 3)
为什么要在这里评估整个列表?
【问题讨论】:
标签:
clojure
functional-programming
lazy-evaluation
chunking
【解决方案1】:
这是因为一种称为分块的性能优化。本质上,序列是在称为块的 n 个项目组中实现的。这意味着您需要注意映射函数中的任何副作用。最终结果是正确的,你仍然得到一个正确长度的序列返回
默认的块大小是 32,所以如果你将你的范围增加到一个更大的值,你会更好地理解发生了什么:
user> (defn seq-trial
[]
(map #(do (println "hello " %) (inc %)) (range 100)))
user> (take 3 (seq-trial))
hello 0 ; 32 item 'chunk' realized...
hello 1
...
hello 30
hello 31
(1 2 3) ; the expected returned value
如果你需要避免分块,有options available