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)))

最初のテイクは期待どおりに動作しますが、2 番目のテイクでは次のエラーが発生します (すべてのシーケンスを評価しているように見えます)。

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

そうです、それはライトテーブルのバグです。ここに記録する必要があります

以下はライトテーブルで問題なく動作します

(->> [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 に答える