2011-12-15 17 views
11

Ho una lista xxs e ho bisogno di crearne una nuova che aggiunga e sommi elementi dalla vecchia lista.Creazione di un nuovo elenco che aggiunge e somma elementi da un elenco precedente

Vorrei richiamare per dimostrare:

visualization of list transformation

Così, ho la lista:

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

Il mio approccio migliore finora è:

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

uscita:

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

Anche se non sono lontano ... Non sono ancora arrivato e apprezzerei davvero qualche suggerimento.

+0

Così il tipo di 'xxs' è' [(String, String, [(Integer, String, String)])]? Perché esattamente hai un valore con un tipo così orrendo per cominciare? –

+0

Beh ... sono i compiti. :/ – Nomics

risposta

7

Il problema con la soluzione è che aux è uguale per ogni elemento di xxs. quando scrivi (x,y,_) <- xxs, stai buttando via la lista con i numeri che vuoi sommare. Invece, mantenere tale elenco, lavorando un elemento alla volta, in modo da:

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

Per trovare la somma delle innerList s, desideri solo i numeri, in modo da poterli buttare via. Dopo che è fatto, si sono lasciati con un elenco di numeri, che può solo essere riassunta con la funzione standard sum:

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

Non che stiamo usando fst3 qui, invece di fst, in quanto questi sono triple, non accoppiamenti.

+0

'doSum list = sum (elenco Fst3)' questa riga ha un errore. Ma forse è giusto per fare i compiti :-) – luqui

+0

Oh, whoops. L'ho modificato per mostrare. – gereeter

4

Eri molto vicino!

Come ha detto il gereeter: il tuo problema principale è che stai utilizzando lo stesso valore di aux per tutto. Se si modifica aux in una funzione prendendo l'elenco di tuple (Int,String,String), allora dovrebbe funzionare per voi.

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

(Non ho davvero aggiunto nulla alla risposta di gereeter salvo per cambiare la forma del codice di esempio per assomigliare più da vicino la vostra.)

Problemi correlati