实施assoc-in功能。提示:使用
assoc
函数并将其参数定义为[m [k & ks] v]
。
虽然我找到了solution(见第39-54行),但我想知道是否有不同的做法。在上一次练习中,我发现jbm implementing the comp function上的这个非常明确的答案非常有帮助。
我一直在尝试通过联合键列表减少部分关联,并将返回的函数应用于最终值:
(defn my-part-assoc [m k]
(partial assoc m k))
((reduce my-part-assoc {} [:one :two :three]) "val")
毋庸置疑,这不起作用。我是Clojure和函数式编程的新手,并且担心我对reduce的基本理解会让我走上错误的道路。有人可以提供更简洁的答案吗?
答案 0 :(得分:3)
发布后不久,我找到了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)))
答案 1 :(得分:0)
这是一个不使用“assoc-in”的解决方案,这似乎是一个要求:
(defn my-assoc-in
[m [k & ks] v]
(if (= (count ks) 0)
(assoc m k v)
(let [ordered-ks (reverse ks)
first-m (get-in m (butlast (cons k ks)))]
(assoc m k (reduce
(fn [curr-m next-k] (assoc {} next-k curr-m))
(assoc first-m (first ordered-ks) v)
(rest ordered-ks))))))```