2015-02-24 28 views
0

此代碼:微調range`s懶惰

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

yealds的整數溢出異常,而此代碼:

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

yealds 1.

兩個碼應該yeald 1但某種原因懶惰的範圍有一個奇怪的行爲。它似乎一次只得到一塊數據而不是一塊。是否有可能使範圍以期望的方式行事?

+0

好吧,我剛剛意識到,我的問題是複製。但是,無論如何,我認爲它應該被接受,因爲它更直接。它比另一個更好。 – 2015-02-24 19:50:25

回答

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