1

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

(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
4

1 回答 1

0

你是对的,这是一个可发光的错误。你应该把它记录在这里

以下工作在 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)))
于 2014-05-14T13:21:03.873 回答