簡體   English   中英

Clojure:實現關聯函數

[英]Clojure: Implementing the assoc-in function

第 5 章,Clojure for the Brave and True 練習 3要求:

實現關聯函數。 提示:使用assoc函數並將其參數定義為[m [k & ks] v]

雖然我找到了這個解決方案(參見第 39-54 行),但我想知道是否有不同的方法。 在進行上一個練習時,我發現 jbm 關於實現 comp 功能的這個非常明確的答案非常有幫助。

我一直在嘗試減少鍵的聯合列表上的部分關聯,並將返回的函數應用於最終值:

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

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

不用說,這是行不通的。 我是 Clojure 和函數式編程的新手,我擔心我對 reduce 的基本理解會導致我走錯路。 請問有人可以提供更簡潔的答案嗎?

發布后不久,我發現了這個,它從Clojure GitHub 存儲庫中獲得了以下定義:

(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)))

這是一個不使用“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))))))```

我認為 Ooberdan 的想法適用於以下情況:

(defn my-as-in 
  "assoc val in nested map with nested key seq"                                
  [mp [ky & kysq] val]                                                          
  (if kysq                                                                     
    (assoc mp ky (my-as-in (get mp ky) kysq val))                                  
    (assoc mp ky val)))   

(my-as-in {} [:is :this :hello] 1)

給出{:is {:this {:hello 1}}}assoc-in ...

看起來整潔且慣用的 Clojure,它向我展示了在我迷失在reduce或 multi arity 類型解決方案中的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM