Clojure lazy-seq给了我ArithmeticException

时间:2014-05-14 11:42:28

标签: exception clojure fibonacci lazy-sequences

我正在尝试重新实现我的自定义地图功能,但它以奇怪的方式工作。有人可以解释为什么会发生这种情况吗?

(defn my-map [f coll]
  (lazy-seq
   (when-let [s (seq coll)]
     (cons (f (first s)) (my-map f (rest s))))))

(take 10 (my-map inc (range)))

(take 10 (->> [0 1]
              (iterate (fn [[a b]] [b (+ a b)]))
              (my-map first)))

首先按预期工作,但第二次给我跟随错误(看起来它评估所有序列):

java.lang.ArithmeticException: integer overflow
    Numbers.java:1388 clojure.lang.Numbers.throwIntOverflow
    Numbers.java:1687 clojure.lang.Numbers.add
     Numbers.java:430 clojure.lang.Numbers$LongOps.add
     Numbers.java:126 clojure.lang.Numbers.add

1 个答案:

答案 0 :(得分:0)

你是对的,这是一个光明的错误。您应该记录here

以下在lighttable中没有问题的工作

(->> [0 1] 
     (iterate (fn [[a b]] [b (+ a b)])) 
     (take 10)
     (my-map first))

(take 10 (->> [0 1M]
              (iterate (fn [[a b]] [b (+ a b)]))
              (my-map first)))