当我使用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
)成功?