我正在通过4clojure工作,但我遇到了问题 156(地图默认值)。
我不明白为什么下面的函数不返回平面地图
((fn [d k] (for [i k :let [r {}]]
(conj r [i d])))
[:a :b] [:foo :bar])
目前的结果是({:foo [:a :b]} {:bar [:a :b]})
但我期待{:foo [:a :b], :bar [:a :b]}
Inside for
,r
在每次迭代中重新创建,填充[i d]
并作为惰性序列的元素生成。结果,您获得了这个序列,其元素是小的单项映射。
你需要的是reduce
. 它使用您提供的函数循环更新累加器的序列:
(defn fun1 [d k]
(reduce
(fn [acc i] (conj acc [i d]))
{}
k))
它从一个空映射开始,并为其中的每个元素调用 lambda i
,k
它向映射添加一个条目(作为 传递给 lambda acc
)。结果是一张包含所有这些条目的大地图。
或者,您可以使用for
表达式生成键/值对,然后使用该into
函数将它们全部推送到地图中:
((fn [d k] (into {} (for [i k] [i d])))
[:a :b] [:foo :bar])
; => {:foo [:a :b], :bar [:a :b]}
对于那些来这里寻找 Clojure 中的平面图功能的人,请查看mapcat
:
将 concat 应用到 f 和 colls 应用 map 的结果返回。