2013-04-30 49 views

回答

9

的Clojure map可以函數的操作數後採取多個seqs和它拉鍊用於每個SEQ一個元素。當第一個seq耗盡時,地圖結束。

在你的表格中,你給map兩個seqs:'(0 1)'((0 1 2 3) (1 2 3)),它們都有兩個元素。因此,該代碼描述了兩個drop電話:

(drop 0 '(0 1 2 3)) ; => '(0 1 2 3) 
(drop 1 '(1 2 3)) ; => '(2 3) 

希望這個文檔有助於明確這件事(重點煤礦):

clojure.core/map ([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls]) 

返回由應用 F到的結果的懶惰序列所述組的每個COLL第一項目,隨後施加F到 該組中的每個第二COLL項,直到colls中任一項是 耗盡。其他colls中的任何剩餘項目都將被忽略。函數
f應該接受colls數量的參數。

+0

謝謝!說得通! – iyerland 2013-04-30 14:16:41

2

請注意,Clojure的map是一個非常靈活的功能,因爲它可以做幾件事情,在其他語言中需要不同的功能。

例如,它所有的東西這三個Haskell函數可以這樣做:

map :: (a -> b) -> [a] -> [b] 
zip :: [a] -> [b] -> [(a, b)] 
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] 

其中

zip = zipWith (,) 

所以Clojure中使用map做兩個不同的東西:

a)將元素順序轉換爲相同長度的順序。這就是Haskell和其他語言中所謂的'map'。

B)郵編兩個或多個序列連成一個元件,明智的,給人一種序列,其只要最短輸入序列。這在Haskell中稱爲'zipWith'。

因爲有輸入序列所提供的功能必須接受盡可能多的參數,並將其返回其應當進入輸出序列中的元素。

你給的代碼使用在其第二個功能map。它從(0 1 2 3)1元素中刪除0元素(1 2 3)。結果是(0 1 2 3)(2 3)進入結果序列。

+0

*(仍在寫作,已經意外發布)*在這種情況下,您可以刪除您的問題,進行編輯並再次取消刪除。 – sloth 2013-04-30 12:35:33

+0

謝謝;-)第一次發生在我身上。 – firefrorefiddle 2013-04-30 12:39:21