Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure中的lazy seq有什么意义?_Clojure_Lazy Evaluation_Fibonacci_Infinite Sequence - Fatal编程技术网

clojure中的lazy seq有什么意义?

clojure中的lazy seq有什么意义?,clojure,lazy-evaluation,fibonacci,infinite-sequence,Clojure,Lazy Evaluation,Fibonacci,Infinite Sequence,我正在查看一些Fibonacci序列clojure代码示例: (def fibs (lazy-cat [1 2] (map + fibs (rest fibs)))) 我基本上了解发生了什么,但不明白懒猫的意思。 我知道,lazy cat是一个正在转换为如下内容的宏: (def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs))))) 什么是lazy seq完成的?即使没有lazy seq,它仍然会被惰性地评估

我正在查看一些Fibonacci序列clojure代码示例:

 (def fibs (lazy-cat [1 2] (map + fibs (rest fibs))))
我基本上了解发生了什么,但不明白懒猫的意思。 我知道,
lazy cat
是一个正在转换为如下内容的宏:

(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs))))) 
什么是
lazy seq
完成的?即使没有
lazy seq
,它仍然会被惰性地评估?这是否严格用于缓存目的

编辑:谢谢你的回答。我的困惑是,它与REPL中的一个普通的
concat
一起工作,因为我以前在范围内绑定过fibs。

据我所知(我承认我还是Clojure的新手!),如果您尝试以下方法:

(def fibs (concat [1 2] (map + fibs (rest fibs))))
那么它就不起作用了,因为fibs还没有绑定,因此后面的两个引用都失败了


不过,您给出的延迟版本会起作用,因为对FIB的引用只会在以后使用序列时才被实际解析,而此时FIB已经被成功地定义为延迟序列。

不需要
[1 2]
上的
延迟序列,但实际上并不有害


(map+fibs(rest-fibs))
上的
惰性seq
是必不可少的;如果没有它,函数调用将在
fibs
绑定到值之前进行计算,这将导致异常。通过将其包装在
lazy seq
中,调用将被推迟到需要该值时,并且
fibs
将在该点上有一个值