创建一个新列表,用于添加和汇总旧列表中的元素

时间:2011-12-15 03:54:58

标签: list haskell

我有一个列表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)]

虽然我并不遥远......我还没到那里,我真的很感激一些建议。

2 个答案:

答案 0 :(得分:7)

解决方案的问题是aux的每个元素xxs都相同。当你写(x,y,_) <- xxs时,你会丢弃你想要求和的数字。相反,保留该列表,一次处理一个元素,所以:

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

要查找innerList的总和,您只需要数字,这样就可以将它们丢弃。完成后,您将看到一个数字列表,这些数字可以与标准sum函数相加:

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

这不是我们在fst3使用fst而不是{{1}},因为它们是三元组而不是对。

答案 1 :(得分:4)

你真的很亲密!

正如gereeter所说:你的主要问题是你使用相同的aux值来表示一切。如果您将aux更改为一个获取(Int,String,String)元组列表的函数,那么它应该适合您。

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

(我没有在gereeter的答案中添加任何内容,只是将示例代码的形式更改为与您的代码更接近。)