2011-12-15 10 views
11

Mam listę xxs i potrzebuję utworzyć nową, która dodaje i sumuje elementy ze starej listy.Tworzenie nowej listy, która dodaje i sumuje elementy ze starej listy

Pozwól mi wyciągnąć go wykazać:

visualization of list transformation

Tak, mam listę:

xxs = [("a","b", [(1,"a","b"),(2,"a","b")]), ("c","d",[(3,"a","b"),(4,"a","b")])] 

Moim najlepszym podejściem do tej pory:

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

Wyjście:

[("a","b",10),("c","d",10)] 

Chociaż nie jestem daleko ... Nie jestem jeszcze na miejscu i naprawdę doceniłbym pewne sugestie.

+0

Więc typ 'xxs' jest' [(String, String, [(Integer, String, String)]]]? Dlaczego właściwie masz wartość z tak przerażającym typem? –

+0

Cóż ... to praca domowa. :/ – Nomics

Odpowiedz

7

Problem z rozwiązaniem polega na tym, że aux jest taki sam dla każdego elementu z xxs. kiedy piszesz (x,y,_) <- xxs, wyrzucasz listę liczbami, które chcesz zsumować. Zamiast zachować tę listę, pracuje jeden element na raz, więc:

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

Aby znaleźć sumę innerList s, chcesz tylko numery, dzięki czemu można je wyrzucić. Po to zrobisz, jesteś w lewo z listy numerów, które mogą być po prostu sumuje ze standardowym sum funkcję:

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

Nie, że używamy fst3 tutaj, zamiast fst, gdyż są trzyosobowe, nie pary.

+0

'lista doSum = suma (lista Fst3)' ta linia ma błąd. Ale może jest to w sam raz dla odrabiania zadań domowych :-) – luqui

+0

Oh, whoops. Zmieniłem to, aby pokazać. – gereeter

4

Byłeś bardzo blisko!

Jako gereeter powiedział: głównym problemem jest to, że używasz tej samej wartości aux za wszystko. Jeśli zmienisz aux w funkcję zajmującą listę krotek (Int,String,String), to powinna ona zadziałać.

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

(I naprawdę nie dodaje nic do odpowiedzi gereeter za wyjątkiem zmiany formy kodu próbki do bardziej przypominają twoje.)