(map #(words %) indexes)
單詞是字符串的向量,索引是一個非負整數的序列。我明白#(...)是一個匿名函數,%代表它的參數。我認爲這個想法是在指定的索引處獲得單詞,但是有人可以將匿名函數重寫爲更容易理解的函數嗎?Clojure代碼的這一行是做什麼的?
(map #(words %) indexes)
單詞是字符串的向量,索引是一個非負整數的序列。我明白#(...)是一個匿名函數,%代表它的參數。我認爲這個想法是在指定的索引處獲得單詞,但是有人可以將匿名函數重寫爲更容易理解的函數嗎?Clojure代碼的這一行是做什麼的?
如果我理解正確的話,你必須:
(def words ["who" "what" "where" "when"])
(def indexes (range 4))
(map #(words %) indexes)
=> ("who" "what" "where" "when")
一個關於Clojure的好東西是標準數據結構也是其成員的功能。這意味着以下內容是等效的:
(get words 1)
=> "what"
(words 1)
=>"what"
這也適用於地圖和集合。前者取一個鍵並返回值。後者在列表中查找參數,如果找到或返回nil。
這只是一個不好的寫(map words indexes)
的方法。我不知道函數words
的功能或indexes
的值是多少,但此代碼在indexes
的每個元素上調用函數words
,並返回一個結果序列。
字(一個懶惰的序列)不,雖然一個函數,它的一個字符串的矢量。 – user1136342
@ user1136342關鍵字'vector',它不是一個函數,但是實現了'Ifn'接口。如果你在原文中使用過這個例子,我們就不用猜了!但是,這個答案仍然是正確的。匿名函數不是必需的,只是'(地圖詞索引)'由於'Ifn'的實現爲'get'的'vector's。 –
@ A.Webb,我用「不是一個函數」來說明:它絕對*是一個函數,因爲它實現了'IFn'。它只是用'[]'而不是'(fn ...)'定義的一個。 – amalloy
(def words ["apple" "banana" "cantaloupe" "date" "fig"])
(ifn? words) ;=> true
(words 0) ;=> "apple"
(words 1) ;=> "banana"
是相當於
(get words 0) ;=> "apple"
(get words 1) ;=> "banana"
所以
(map #(words %) [0 1])
相當於
((get words 0) (get words 1))
對於向量'v','(v x)'不嚴格等於'(get v x)'。具體來說,如果'x'不是一個整數,或者超出'v'的索引範圍,'(v x)'將拋出異常,而'(get v x)'將返回nil。 – amalloy
+1擊敗了我,並有更好的解釋! –
感謝您的評論! –