Con*_*ion 5 functional-programming clojure lazy-evaluation
Clojure功能
(reductions + 0 (cycle [1 1 -1]))
Run Code Online (Sandbox Code Playgroud)
产生序列[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]))
Run Code Online (Sandbox Code Playgroud)
(我展示了这个,因为这是我想最终工作的那种版本,如果有任何区别的话)
不幸的是,这个序列不是懒惰的.
哦,是的,确实如此.我们可以通过采用它的前10个元素来快速检查它是否是懒惰的:
(take 10 (reductions + 0 (cycle [1 1 -1])))
Run Code Online (Sandbox Code Playgroud)
这很快就会返回一个答案,这证明了序列是懒惰的.如果函数不是懒惰的,它会尝试实现无限序列中的所有元素,并且会破坏内存,或者挂起无限循环.
你会在REPL中输入这个func,它会在显示给你之前尝试实现序列.
编辑:如果你发现你已经触发了一个或意外地试图实现无限的seq,使用这个技巧来阻止无限循环.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |