Создание нового списка, который добавляет и суммирует элементы из старого списка

У меня есть список 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)]

Хотя Im не за горами... Я еще не совсем там и буду очень благодарен за некоторые предложения.

Ответ 1

Проблема с вашим решением заключается в том, что 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, поскольку это тройки, а не пары.

Ответ 2

Вы были очень близки!

Как сказал gereeter: ваша главная проблема в том, что вы используете то же значение aux для всего. Если вы измените aux на функцию, берущую список кортежей (Int,String,String), то она должна работать для вас.

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

(Я вообще ничего не добавил к запросу gereeter, кроме как изменить форму кода примера, чтобы более точно походить на ваш.)