此代码:
(first (map (fn [d]
(apply * (repeat d 10)))
(range)))
yealds一个整数溢出异常,而这段代码:
(first (map (fn [d]
(apply * (repeat d 10)))
(range 0 1)))
yealds 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