簡體   English   中英

clojure中的lazy-seq有什么意義?

[英]Whats the point of lazy-seq in clojure?

我正在看一些斐波那契序列Clojure代碼示例:

 (def fibs (lazy-cat [1 2] (map + fibs (rest fibs))))

我通常理解發生了什么,但是不明白lazy-cat 我知道lazy-cat是一個宏,它會翻譯成如下形式:

(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs))))) 

lazy-seq到底能完成什么工作? 即使沒有lazy-seq它仍然會被延遲評估。 這是嚴格出於緩存目的嗎?

編輯:感謝您的答案。 我的困惑是,它與REPL的普通concat使用,因為我以前曾將示波器綁定到范圍上。

不需要[1 2]上的lazy-seq ,但是並沒有真正的傷害。

(map + fibs (rest fibs))上的lazy-seq是必不可少的; 沒有它,函數調用將在fibs綁定到一個值之前進行評估,這將導致異常。 通過將其包裝在lazy-seq ,調用將被推遲到需要該值時為止,而fibs屆時將具有一個值。

據我了解(並且我承認仍然是Clojure的相對新手!),如果您嘗試以下操作:

(def fibs (concat [1 2] (map + fibs (rest fibs))))

然后它將無法工作,因為尚未綁定fib,因此以后對其的兩次引用都失敗了。

但是,您給出的延遲版本將起作用,因為對fibs的引用僅在序列被消耗時才實際解析,並且到那時fib已被成功定義為lazy序列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM