我有一个列表xxs,我需要创建一个新的,添加和总结旧列表中的元素.
让我画它来证明:

所以,我有这个清单:
xxs = [("a","b", [(1,"a","b"),(2,"a","b")]), ("c","d",[(3,"a","b"),(4,"a","b")])]
Run Code Online (Sandbox Code Playgroud)
到目前为止,我最好的方法是:
infoBasicas = [ (x,y,aux) | (x,y,_) <- xxs]
where aux = sum [ z | (_,_,ys) <- xxs, (z,_,_) <- ys]
Run Code Online (Sandbox Code Playgroud)
输出:
[("a","b",10),("c","d",10)]
Run Code Online (Sandbox Code Playgroud)
虽然我并不遥远......我还没到那里,我真的很感激一些建议.
解决方案的问题是aux每个元素都是相同的xxs.当你写作时(x,y,_) <- xxs,你将丢弃你想要总和的数字列表.相反,保留该列表,一次处理一个元素,所以:
infoBasicas = [(x, y, doSum innerList) | (x, y, innerList) <- xxs]
Run Code Online (Sandbox Code Playgroud)
要查找innerLists 的总和,您只需要数字,这样就可以将它们丢弃.完成后,您将看到一个数字列表,这些数字可以与标准sum函数相加:
doSum list = sum (fst3 list) -- There is one small error here. Can you see what it is?
fst3 (a, _, _) = a
Run Code Online (Sandbox Code Playgroud)
不是我们在fst3这里使用,而不是fst因为这些是三元组,而不是对.