-1

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

4

3 回答 3

2

Inside for,r在每次迭代中重新创建,填充[i d]并作为惰性序列的元素生成。结果,您获得了这个序列,其元素是小的单项映射。

你需要的是reduce. 它使用您提供的函数循环更新累加器的序列:

(defn fun1 [d k] 
  (reduce 
    (fn [acc i] (conj acc [i d])) 
    {} 
    k))

它从一个空映射开始,并为其中的每个元素调用 lambda ik它向映射添加一个条目(作为 传递给 lambda acc)。结果是一张包含所有这些条目的大地图。

于 2013-09-15T12:48:00.963 回答
2

或者,您可以使用for表达式生成键/值对,然后使用该into函数将它们全部推送到地图中:

((fn [d k] (into {} (for [i k] [i d])))
  [:a :b] [:foo :bar])
; => {:foo [:a :b], :bar [:a :b]}
于 2013-09-16T01:49:52.907 回答
0

对于那些来这里寻找 Clojure 中的平面图功能的人,请查看mapcat

将 concat 应用到 f​​ 和 colls 应用 map 的结果返回。

于 2020-05-10T00:17:01.440 回答