2016-12-11 40 views
1

Chapter 5, Exercise 3勇敢和真實需要:的Clojure:Clojure中實施assoc命令,在功能

落實assoc命令的函數。提示:使用assoc函數並將其參數定義爲[m [k & ks] v]

雖然我找到了這個solution(見39-54行),我想知道是否有不同的方式來做到這一點。在練習上一個練習時,我發現jbm在implementing the comp function上的這個非常明確的答案非常有幫助。

我一直在試圖減少過度鍵的連體清單的部分assoc命令和應用功能返回到最終值:

(defn my-part-assoc [m k] 
    (partial assoc m k)) 

((reduce my-part-assoc {} [:one :two :three]) "val") 

不用說,這是行不通的。我對Clojure和函數式編程不熟悉,擔心我對reduce的非常基本的理解導致我走錯了路。請有人提供一個更簡潔的答案?

回答

2

發佈後不久,我發現this,它得到來自Clojure GitHub repo以下定義:

(defn assoc-in 
    ;; metadata elided 
    [m [k & ks] v] 
    (if ks 
    (assoc m k (assoc-in (get m k) ks v)) 
    (assoc m k v))) 
+0

我不知道這是否構成一個副本。雖然我在堆棧溢出中找到了我的答案,但我已將問題保留爲活動狀態,因爲它非常具體,可能會幫助處於相同位置的其他人。 – Ooberdan

+0

注意到,與核心版本不同,你的失敗是這樣的:'(assoc-in {} [:a:b:c] 1)'... – leetwinski

+0

不,@leetwinski,工作正常。 – amalloy