Clojure:在函数中实现assoc
在Clojure中,勇敢和真诚的人需要: 在功能上实现assoc。提示:使用assoc函数并将其参数定义为[m[k&ks]v] 虽然我发现这一点,请参见第39-54行,但我想知道是否有其他方法。在进行上一个练习时,我发现jbm的这个非常清晰的答案非常有用 我一直在尝试减少键的联合列表上的部分assoc,并将返回的函数应用于最终值:Clojure:在函数中实现assoc,clojure,Clojure,在Clojure中,勇敢和真诚的人需要: 在功能上实现assoc。提示:使用assoc函数并将其参数定义为[m[k&ks]v] 虽然我发现这一点,请参见第39-54行,但我想知道是否有其他方法。在进行上一个练习时,我发现jbm的这个非常清晰的答案非常有用 我一直在尝试减少键的联合列表上的部分assoc,并将返回的函数应用于最终值: (defn my-part-assoc [m k] (partial assoc m k)) ((reduce my-part-assoc {} [:one :
(defn my-part-assoc [m k]
(partial assoc m k))
((reduce my-part-assoc {} [:one :two :three]) "val")
不用说,这是行不通的。我不熟悉Clojure和函数式编程,担心我对reduce的基本理解会让我走上错误的道路。请有人能提供一个更简洁的答案吗?我在发布后不久发现,这从以下定义中得到:
以下是一个不使用assoc的解决方案,它似乎是一个要求:
(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))))))```
我不确定这是否构成重复。虽然我在堆栈溢出问题上找到了答案,但我的问题一直处于活动状态,因为它非常具体,可能会帮助处于相同位置的其他人。请注意,与核心版本不同,您的问题可能会失败,原因是{}[:a:b:c]1中的assoc。。。
(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))))))```