2014-09-06 96 views
0

我很困惑,爲什麼下面的代碼進入一個無限循環,並沒有返回的時候,我呼籲lazy-seq一個懶惰的序列:Clojure的 - 功能沒有返回一個懶惰的序列

(= (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只是旋轉的範圍被無限調用。

我該如何讓這個函數表現得很懶惰?

回答

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解釋減少非懶惰。

+0

會不會有同樣的結果減少,它會旋轉? – dagda1 2014-09-06 13:05:24

+0

不,因爲減少需要迭代,直到序列爲空,因此您可以得到最終結果,建議的函數僅在需要時纔會重複出現。你可以使用'reductions'也 – 2014-09-06 14:07:54

+0

謝謝,我試圖重新創建減少來增加我的clojure知識,所以它只是爲了好玩 – dagda1 2014-09-06 14:52:12

相關問題