为什么不仅仅是懒惰函数调用的Clojure函数也是懒惰的?

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)

(我展示了这个,因为这是我想最终工作的那种版本,如果有任何区别的话)

Leo*_*nel 9

不幸的是,这个序列不是懒惰的.

哦,是的,确实如此.我们可以通过采用它的前10个元素来快速检查它是否是懒惰的:

(take 10 (reductions + 0 (cycle [1 1 -1])))
Run Code Online (Sandbox Code Playgroud)

这很快就会返回一个答案,这证明了序列是懒惰的.如果函数不是懒惰的,它会尝试实现无限序列中的所有元素,并且会破坏内存,或者挂起无限循环.

你会在REPL中输入这个func,它会在显示给你之前尝试实现序列.

编辑:如果你发现你已经触发了一个或意外地试图实现无限的seq,使用这个技巧来阻止无限循环.