【发布时间】:2013-04-30 07:48:23
【问题描述】:
当我使用lazySeq 时有很多困惑。
问题:
(def fib
(lazy-seq
(concat [0 1] (map + fib (rest fib))))) ;; It's Ok
(take 10 fib) ;; Bomb
收到错误消息:StackOverflowError clojure.lang.RT.more (RT.java:589)
以下解决方案效果很好:
(def fib
(concat [0 1] (lazy-seq (map + fib (rest fib))))) ;; Works well
(def fib
(lazy-cat [0 1] (map + fib (rest fib)))) ;; Works well
concat 和map 都返回惰性序列,为什么上面的程序看起来很像但有区别?
更详细地说,为什么第一个示例(lazy-seq 包装 concat)失败,但下面的示例(lazy-seq 包装 map)成功?
【问题讨论】:
-
@DominicKexel,实际上不一样,我的问题是关注
lazy-seq的顺序(或位置)。在第一个示例中,lazy-seq位于concat之外并使用炸弹,但第二个示例lazy-seq只是包裹map并且效果很好。所以我认为lazy-seq的顺序很重要,这就是我想知道的,你的链接没有解释它。 -
我很确定这个问题的答案很好地解释了这一点。
-
mikera(谁的回答被接受了)说“你放什么顺序并不重要。”。但我的问题表明订单很重要。您认为答案如何解释得很好?我读了问题和答案,发现这不是我想要的,你有没有清楚地读过我的问题? @DominicKexel
-
@mikera 期待您的回答。