clojure - 函数不返回懒惰序列

时间:2014-09-06 12:18:53

标签: clojure

我很困惑为什么下面的代码进入无限循环并且在我调用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才会旋转。

如何让这个功能懒散?

1 个答案:

答案 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解释减少的非懒惰。