Clojure:实现关联函数

时间:2016-12-11 07:29:35

标签: clojure

在Clojure中为勇敢和真实的

Chapter 5, Exercise 3要求:

  

实施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的基本理解会让我走上错误的道路。有人可以提供更简洁的答案吗?

2 个答案:

答案 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))))))```