【问题标题】: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

    【讨论】:

    • 副作用和惰性求值不能混用。
    猜你喜欢
    • 2022-12-25
    • 2011-03-06
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    相关资源
    最近更新 更多