[英]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.