2015-12-02 105 views
1

我剛剛開始學習Clojure,並且在參考範圍中看到了'take'函數的幾種用法。(取5(範圍))和(範圍5)

具體

(take 5 (range)) 

這似乎等同於

(range 5) 

都產生

(0 1 2 3 4) 

是否有一個原因無論是曲風還是性能,使用一個或其他?

+0

也許作者只是想說明使用take'的'鏈接。通過'(範圍)'來提供一個非常簡單的例子。 – Mars

回答

5

一般來說,使用(range 5)可能會更高效,我會認爲它更習慣。但是請記住,這需要人們瞭解創建時範圍的範圍。

如果初始尺寸未知,或者其他轉換可能在施工後發生,使用take選項相當不錯。例如:

(->> (range) (filter even?) (drop 1) (take 5)) 
+1

還要注意,take(和其他)也可以用作與上述代碼類似的傳感器:(sequence(comp(filter even?)(drop 1)(take 5))(range)),但可以使用在更廣泛的情況下。例如,可以使用(comp(filter even?)(drop 1)(take 5))傳感器來處理core.async api中的值流。 – optevo

1

範圍可以有以下幾種形式

(range) #or 
(range end) #or 
(range start end) #or 
(range start end step) 

所以在這裏你必須在你生成,並且使用(範圍)在你的榜樣產生集合 的範圍控制使用會給一個懶惰的序列,將根據需要評估,所以你需要功能需要5項,所以這些很多項目生成

雖然採取像

(take n) #or 
(take n coll) 

,你需要通過從要採取n項

3

兩個集合有同樣的表現。因爲(範圍)函數正在返回一個懶惰的seq,直到訪問元素纔會實現。根據Danial Higginbotham在他的着作「勇敢而真實的Clojure」中,惰性序列 由兩部分組成:一部分是如何實現一個序列的元素以及元素已經實現的配方。當您使用(範圍)時,它不包含任何已實現的元素 ,但它確實具有生成其元素的配方。每次嘗試訪問未實現的元素時,懶惰seq將使用其配方來生成請求的元素。

這裏是深入闡述懶SEQ http://www.braveclojure.com/core-functions-in-depth/