【发布时间】:2015-12-17 17:39:12
【问题描述】:
这几乎是我上一个问题 (Clojure idiomatic way to update multiple values of map) 的后续,但并不完全相同。 (请记住,我对 Clojure 和函数式语言都相当陌生)
假设我有以下数据结构,定义为集合的映射:
(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)))
不用说这是一个失败。那么,如何做到这一点的惯用方式呢?
【问题讨论】: