我很困惑为什么下面的代码进入无限循环并且在我调用lazy-seq
时不返回延迟序列:
(= (take 5 ((fn [func se]
(lazy-seq
(reduce (fn [acc item]
(conj acc (func (last acc) item)))
[(first se)] (rest se))))
+
(range)))
[0 1 3 6 10])
当范围被无限调用时,repl才会旋转。
如何让这个功能懒散?
答案 0 :(得分:2)
为了构建一个惰性序列,你需要返回一个根据需要实现的序列。
你在函数中所做的只是在lazy-seq
调用中无限减少。
这种模式通常有效,并且只在需要时才实现新元素:
(lazy-seq
(cons element (recursion ..
这意味着如果你想构建一个懒惰的缩减,你将会在这些方面做一些事情:
(fn [f s init]
(lazy-seq
(let [acc (f (first s) init)]
(cons acc (recur f (rest s) acc))
在这种情况下,您返回的序列将作为部分实现的序列存在于内存中
(0 1 3 (recur + (rest s) 3))
其余元素仅存在logically
作为要调用的递归。
你可以看看this previous answer解释减少的非懒惰。