从函数返回序列

时间:2011-10-11 16:01:17

标签: clojure

我把以下功能放在一起。它应该采用嵌套(多层)地图并返回一系列平面地图;但是,它当前返回序列中的序列。

有谁知道为什么序列嵌套在另一个序列中?

(defn collapse [data & keys-coll]
  (if (map? data)
    (for [[k v] data]
      (collapse v (if (nil? keys-coll)
                    (conj [] k)
                    (conj (into [] keys-coll) k))))
    (hash-map (flatten keys-coll) data)))

(collapse {"a" {2011 [["a" 2011 "dan"] ["a" 2011 "ari"]] 2010 [["a" 2010 "jon"]]}})

结果:

( ({("a" 2011) [["a" 2011 "dan"] ["a" 2011 "ari"]]}
   {("a" 2010) [["a" 2010 "jon"]]}) )

预期/期望结果(注意序列,而不是上面序列中的序列):

({("a" 2011) [["a" 2011 "dan"] ["a" 2011 "ari"]]}
 {("a" 2010) [["a" 2010 "jon"]]})

注意:预期结果是一系列地图;每个地图都由复合键和嵌套向量组成。

1 个答案:

答案 0 :(得分:1)

您在另一个序列中获取序列的原因是for返回一个惰性序列。因为每次collapse遇到一张地图时都会调用它,而你提供的地图会深入两层,你会得到两层深度嵌套的序列。

快速修复:将flatten放在for前面,如下所示:

(defn collapse [data & keys-coll]
  (if (map? data)
    (flatten 
     (for [[k v] data]
       (collapse v (conj keys-coll k))))
    (hash-map (flatten keys-coll) data))

(请注意,您也可以删除if语句)。也许不是最优雅的解决方案,但现在正遭受大脑冻结......