(map drop '(0 1) '((0 1 2 3) (1 2 3)))
答案是:((0 1 2 3)(2 3))我需要幫助破譯這個Clojure的代碼
有人能請解釋一下到底是怎麼回事?我無法破譯這段代碼?
謝謝!
(map drop '(0 1) '((0 1 2 3) (1 2 3)))
答案是:((0 1 2 3)(2 3))我需要幫助破譯這個Clojure的代碼
有人能請解釋一下到底是怎麼回事?我無法破譯這段代碼?
謝謝!
的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數量的參數。
請注意,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)
進入結果序列。
*(仍在寫作,已經意外發布)*在這種情況下,您可以刪除您的問題,進行編輯並再次取消刪除。 – sloth 2013-04-30 12:35:33
謝謝;-)第一次發生在我身上。 – firefrorefiddle 2013-04-30 12:39:21
謝謝!說得通! – iyerland 2013-04-30 14:16:41