2011-10-11 54 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語句)。也許不是最優雅的解決方案,但現在正在遭受大腦凍結...