我剛剛開始學習Clojure,並且在參考範圍中看到了'take'函數的幾種用法。(取5(範圍))和(範圍5)
具體
(take 5 (range))
這似乎等同於
(range 5)
都產生
(0 1 2 3 4)
是否有一個原因無論是曲風還是性能,使用一個或其他?
我剛剛開始學習Clojure,並且在參考範圍中看到了'take'函數的幾種用法。(取5(範圍))和(範圍5)
具體
(take 5 (range))
這似乎等同於
(range 5)
都產生
(0 1 2 3 4)
是否有一個原因無論是曲風還是性能,使用一個或其他?
一般來說,使用(range 5)
可能會更高效,我會認爲它更習慣。但是請記住,這需要人們瞭解創建時範圍的範圍。
如果初始尺寸未知,或者其他轉換可能在施工後發生,使用take
選項相當不錯。例如:
(->> (range) (filter even?) (drop 1) (take 5))
還要注意,take(和其他)也可以用作與上述代碼類似的傳感器:(sequence(comp(filter even?)(drop 1)(take 5))(range)),但可以使用在更廣泛的情況下。例如,可以使用(comp(filter even?)(drop 1)(take 5))傳感器來處理core.async api中的值流。 – optevo
範圍可以有以下幾種形式
(range) #or
(range end) #or
(range start end) #or
(range start end step)
所以在這裏你必須在你生成,並且使用(範圍)在你的榜樣產生集合 的範圍控制使用會給一個懶惰的序列,將根據需要評估,所以你需要功能需要5項,所以這些很多項目生成
雖然採取像
(take n) #or
(take n coll)
,你需要通過從要採取n項
兩個集合有同樣的表現。因爲(範圍)函數正在返回一個懶惰的seq,直到訪問元素纔會實現。根據Danial Higginbotham在他的着作「勇敢而真實的Clojure」中,惰性序列 由兩部分組成:一部分是如何實現一個序列的元素以及元素已經實現的配方。當您使用(範圍)時,它不包含任何已實現的元素 ,但它確實具有生成其元素的配方。每次嘗試訪問未實現的元素時,懶惰seq將使用其配方來生成請求的元素。
這裏是深入闡述懶SEQ http://www.braveclojure.com/core-functions-in-depth/
也許作者只是想說明使用take'的'鏈接。通過'(範圍)'來提供一個非常簡單的例子。 – Mars