微调范围懒惰

时间:2015-02-24 14:02:05

标签: clojure lazy-evaluation

此代码:

(first (map (fn [d] 
              (apply * (repeat d 10)))
            (range)))

yealds一个整数溢出异常,而这段代码:

(first (map (fn [d] 
              (apply * (repeat d 10)))
            (range 0 1)))

yealds 1。

这两个代码应该是1但是由于某种原因,范围的懒惰有一种奇怪的行为。它似乎得到了数据,而不是一次只有一个。是否可以使范围以所需的方式运行?

1 个答案:

答案 0 :(得分:3)

作为性能优化,

range被分块。有几种方法可以解决此问题,包括使用(iterate inc 0)unchunk(有几个版本,这个版本是从math.combinatorics复制的)

(defn unchunk
  [s]
  (lazy-seq
    (when (seq s)
      (cons (first s)
            (unchunk (rest s))))))
user=> (first (map (fn [d]
                     (apply * (repeat d 10)))
                   (unchunk (range)))
1