Clojure用for创建一个平面地图

时间:2013-09-15 12:21:35

标签: clojure

我正在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]}

3 个答案:

答案 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。