我正在尝试重新实现我的自定义地图功能,但它以奇怪的方式工作。有人可以解释为什么会发生这种情况吗?
(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
答案 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)))