我正在4clojure工作,我被Problem 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]}
答案 0 :(得分:2)
在for
内,r
在每次迭代中重新创建,填充[i d]
并作为延迟序列的元素产生。因此,您将获得此序列,其元素是小的单入口映射。
您需要的是reduce
。它使用您提供的函数循环更新累加器的序列:
(defn fun1 [d k]
(reduce
(fn [acc i] (conj acc [i d]))
{}
k))
它从一个空映射开始,对于i
中的每个元素k
,它调用lambda,它向地图添加一个条目(作为acc
传递给lambda)。结果是一张包含所有这些条目的大地图。
答案 1 :(得分:2)
或者,您可以使用for
表达式生成键/值对,然后使用into
function将它们全部推送到地图中:
((fn [d k] (into {} (for [i k] [i d])))
[:a :b] [:foo :bar])
; => {:foo [:a :b], :bar [:a :b]}
答案 2 :(得分:0)
对于那些来这里在Clojure中寻找平面图功能的人,请查看mapcat
:
将应用concat的结果返回到将map应用于的结果 f和colls。