Clojure功能
(reductions + 0 (cycle [1 1 -1]))
产生序列[0 1 2 1 2 3 2 3 4 3 4 5 ...]。不幸的是,这个序列不是懒惰的。
由于cycle
和reductions
都被记录为返回延迟序列,我期望这些函数的这种组合也返回一个惰性序列。为什么不呢,如何修复它以便懒惰地返回序列?
一个更复杂的例子,显示了同样的问题:
(reductions (fn [x f] (f x)) 0 (cycle [inc inc dec]))
(我证明了这一点,因为这是我希望最终能够使用的那种版本,如果有任何不同的话)
答案 0 :(得分:9)
不幸的是,这个序列并不是懒惰的。
哦,是的,是的。我们可以通过采用它的前10个元素来快速检查它是否是懒惰的:
(take 10 (reductions + 0 (cycle [1 1 -1])))
这很快就会返回一个答案,证明序列是懒惰的。如果函数不是懒惰的,它会尝试实现无限序列中的所有元素,并且会破坏内存,或者挂起无限循环。
你在REPL中输入这个func会发生什么事情,它会在向你展示之前尝试实现这个序列。
编辑:如果您发现自己触发了一个或意外尝试实现无限序列,请使用此提示stop infinite loops。