我的評論被去太長篇大論,所以......
- 沒有錯,你的任何代碼。
- 您可能也會看到
(into {} (map (juxt identity f) coll))
- 這樣做的一個常見原因是緩存某些功能的輸入結果。
- 還有其他的用例,例如你已經完成了,例如當特別需要散列圖時。
- 當且僅當#3碰巧是你的用例,然後
memoize
爲你做這個。
如果函數是f
,將得到的地圖是m
然後(f x)
和(m x)
具有在域的值相同。但是,(m x)
的值已經預先計算,換句話說,已被記錄。
事實上,memoize在場景背後確實做了同樣的事情,它只是不能直接訪問地圖。以下是對memoize
來源的微小修改以查看此內容。
(defn my-memoize
"Exactly the same as memoize but the cache memory atom must
be supplied as an argument."
[f mem]
(fn [& args]
(if-let [e (find @mem args)]
(val e)
(let [ret (apply f args)]
(swap! mem assoc args ret)
ret))))
現在,證明
(defn my-map-to-coll [f coll]
(let [m (atom {})
g (my-memoize f m)]
(doseq [x coll] (g x))
@m))
而且,正如你的榜樣
(my-map-to-coll #(+ 2 %) [1 2 3])
;=> {(3) 5, (2) 4, (1) 3}
但需要注意的是參數(或多個)被封裝在一個序列memoize的處理多種元數函數以及。
沒有錯。你可能還會看到'(到{}(地圖(juxt identity f)coll))'。核心中類似的功能是爲常見用例「記憶」。 –
@ A.Webb您能詳細說明與「memoize」的連接嗎? – viebel
如果函數爲f,並且結果圖爲m,則在(lx)域中'(f x)'和'(m x)'具有相同的值。然而,'(m x)'的值已經被預先計算,換句話說就是memoized。 –