2011-10-11 99 views
1

我把下面的函数放在一起。它应该采用嵌套(多层)地图并返回一系列平面地图;然而,它目前在一个序列中返回一个序列。从函数返回序列

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

(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"]]}) )

预期/所需的结果(注意序列,NOT的序列内的序列如上):

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

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

+0

由于输入映射是嵌套的,所以输出序列是嵌套的。由于我不知道代码* *应该做什么,因此无法真正帮助您。 –

+0

@JoostDiepenmaat:我添加了更多关于代码应该做什么的信息。本质上,该函数应该将嵌套地图平铺成** a **平面地图序列。该函数根据需要平滑嵌套地图,但它会在另一个序列*中返回一系列地图*,而不仅仅是地图序列。 – Ari

回答

1

您在另一个序列中获取序列的原因是for返回一个惰性序列。因为每次调用collapse都会遇到地图,并且您提供的地图嵌套深两级,所以您会获得嵌套深度两级的序列。

快速修复:把flattenfor的面前就像这样:

(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语句)。也许不是最优雅的解决方案,但现在正在遭受大脑冻结...