繁体   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