这基本上是我上一个问题(Clojure idiomatic way to update multiple values of map)的跟进,但并不完全相同。(请记住,我对Clojure和函数式语言都还很陌生。)
假设我有以下数据结构,定义为映射集合的地图:
我想要做的是将在m1中对应的m2注册表更新为特定值。假设我想要的值是x。更新后的m2应该如下所示:
假设
毋庸置疑,这是一个失败的尝试。那么,什么是惯用的做法呢?
假设我有以下数据结构,定义为映射集合的地图:
(def m1 {:1 #{2} :2 #{1 3} :3 #{1}})
并且有一个如下的映射表:
(def m2 {:1 {:1 0 :2 12 :3 23} :2 {:1 23 :2 0 :3 4} :3 {:1 2 :2 4 :3 0}})
我想要做的是将在m1中对应的m2注册表更新为特定值。假设我想要的值是x。更新后的m2应该如下所示:
{:1 {:1 0 :2 x :3 23} :2 {:1 x :2 0 :3 x} :3 {:1 x :2 4 :3 0}}
假设
v
包含我的地图的所有可能键,我的第一次尝试是像这样做的(我惨败了):(假设x=1
)。(for [i v]
reduce (fn [m j] (assoc-in m [i j] 1)) d (i m1)))
毋庸置疑,这是一个失败的尝试。那么,什么是惯用的做法呢?
(map (comp (partial vector k) keyword str) v))
我的意思是,这里的comp
到底是在做什么?我知道它正在组合部分函数,并将str转换为关键字,但您能否再解释得更详细一些呢? - Arthur Camaramapcat
迭代条目[k v]
,从[:1 #{2}]
开始。通过comp
和partial
生成一个函数,如(fn [num] (vector :1 (keyword (str num))))
,然后将其映射到集合v
中的所有*数字上。这样就得到了一个向量序列,其中所有第一个成员都是:1
,然后将其交回给mapcat
。然后将所有这些序列组合成一个序列。需要一点时间才能学会阅读这些comp
&partial
组合,因为在返回的函数中,数据首先从最后一个参数fn流向左侧。 - Magos