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

Nom*_*ics 11 haskell list

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

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

ger*_*ter 7

解决方案的问题是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因为这些是三元组,而不是对.