【问题标题】:Whats the point of lazy-seq in clojure?clojure 中的惰性序列有什么意义?
【发布时间】:2011-02-26 01:02:03
【问题描述】:

我正在查看一些示例 Fibonacci 序列 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 一起使用,因为我以前绑定到范围内的 fibs。

【问题讨论】:

    标签: clojure lazy-evaluation fibonacci infinite-sequence


    【解决方案1】:

    据我了解(而且我承认我仍然是 Clojure 的新手!),如果您尝试以下操作:

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

    那么它就不起作用了,因为 fibs 还没有被绑定,因此后面对它的两次引用都失败了。

    但是,您提供的惰性版本将起作用,因为对 fibs 的引用仅在稍后使用序列时才真正解决 - 并且此时 fibs 已成功定义为惰性序列。

    【讨论】:

      【解决方案2】:

      [1 2] 上的 lazy-seq 不是必需的,但并没有真正的伤害。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 2010-12-08
        • 2014-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多