为什么不是';一个Clojure函数如果只包含lazy函数,那么它也会调用lazy函数吗?
Clojure函数为什么不是';一个Clojure函数如果只包含lazy函数,那么它也会调用lazy函数吗?,clojure,functional-programming,lazy-evaluation,Clojure,Functional Programming,Lazy Evaluation,Clojure函数 (reductions + 0 (cycle [1 1 -1])) 生成一个序列[0 1 2 1 2 3 3 4 4 5…]。不幸的是,这个序列不是懒惰的 由于和都被记录为返回惰性序列,我希望这些函数的组合也会返回惰性序列。为什么它不能,我如何修复它以懒洋洋地返回序列 显示相同问题的更复杂示例: (reductions (fn [x f] (f x)) 0 (cycle [inc inc dec])) (我展示了这一点,因为这是我希望最终能够实现的版本,以防有任何不同)
(reductions + 0 (cycle [1 1 -1]))
生成一个序列[0 1 2 1 2 3 3 4 4 5…]。不幸的是,这个序列不是懒惰的
由于和都被记录为返回惰性序列,我希望这些函数的组合也会返回惰性序列。为什么它不能,我如何修复它以懒洋洋地返回序列
显示相同问题的更复杂示例:
(reductions (fn [x f] (f x)) 0 (cycle [inc inc dec]))
(我展示了这一点,因为这是我希望最终能够实现的版本,以防有任何不同)
不幸的是,这个序列不是懒惰的
哦,是的,是的。我们可以通过获取它的前10个元素来快速检查它是否懒惰:
(take 10 (reductions + 0 (cycle [1 1 -1])))
这会很快返回一个答案,这证明序列是惰性的。如果函数不是懒惰的,它将尝试实现无限序列中的所有元素,并将耗尽内存,或者挂起在无限循环中
发生的情况是,您在REPL中键入这个func,它会在向您显示之前尝试实现该序列
编辑:如果您发现自己触发了一个或无意中尝试实现一个无限序列,请使用此提示 谢谢:)。我试着用(def…)声明对序列进行别名处理以防止出现这种情况,但当然(我现在意识到)这不起作用。用一个(defn…)命名就可以了。检查函数是否懒惰的一个更准确的方法是将它包装在realized?中。如果返回false,则函数是惰性的。=>(已实现?(减少+0(周期[11-1]))false
已实现?
在这方面效果很差(事实上,在大多数情况下;希望很快得到改善)。尝试所有这些值:[]
,nil
,'(a b c)
,(iterate inc 0)
,你就会明白我的意思了。