我有一个列表xxs
,我需要创建一个新的列表来添加和汇总旧列表中的元素。
让我画它来证明:
所以,我有清单:
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 :(得分: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的答案中添加任何内容,只是将示例代码的形式更改为与您的代码更接近。)