2011-12-15 133 views
11

我有一個列表xxs,我需要創建一個新列表,並添加舊列表中的元素。創建一個新列表,添加和從舊列表中添加元素

讓我畫出來證明:

visualization of list transformation

所以,我有名單:

xxs = [("a","b", [(1,"a","b"),(2,"a","b")]), ("c","d",[(3,"a","b"),(4,"a","b")])] 

我的最好的辦法,到目前爲止是:

infoBasicas = [ (x,y,aux) | (x,y,_) <- xxs] 
    where aux = sum [ z | (_,_,ys) <- xxs, (z,_,_) <- ys] 

輸出:

[("a","b",10),("c","d",10)] 

儘管我並不遙遠...我還沒有到那裏,並會真正感謝一些建議。

+0

所以xxs`的`類型是`[(字符串,字符串,[(整數,字符串,字符串)])]`?爲什麼你真的有這樣一個可怕類型的價值開始? – 2011-12-15 08:51:55

+0

呃...這是家庭作業。 :/ – Nomics 2011-12-15 12:40:43

回答

7

與您的解決方案的問題是aux是相同的每個元素xxs。當你寫(x,y,_) <- xxs時,你正在扔掉你想要求和的數字。取而代之的是,保持這一名單,一次工作一個元素,那麼:

infoBasicas = [(x, y, doSum innerList) | (x, y, innerList) <- xxs] 

要找到innerList S的總和,你只需要數字,所以你可以把它們扔掉。做到這一點後,你留下了號碼的列表,這剛好可以與標準sum功能總結:

doSum list = sum (fst3 list) -- There is one small error here. Can you see what it is? 
fst3 (a, _, _) = a 

這並不是說我們使用fst3這裏,而不是fst,因爲這些三元,不對。

4

你真的很接近!

正如gereeter所說:您的主要問題是您對所有內容都使用相同的值aux。如果您將aux更改爲採用(Int,String,String)元組列表的函數,那麼它應該適合您。

infoBasicas = [ (x,y,aux z) | (x,y,z) <- xxs ] 
    where aux xs = sum [ z | (z,_,_) <- xs ] 

(我還沒有真正添加什麼gereeter的回答除了更改示例代碼的形式,使其更接近你的。)