Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:在函数中实现assoc_Clojure - Fatal编程技术网

Clojure:在函数中实现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 :

在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 :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))))))```