2011-12-15 15 views
11

Tengo una lista xxs y necesito crear una nueva que agregue y sume elementos de la lista anterior.Creando una nueva lista que agrega y suma elementos de una lista anterior

Permítanme llamar a demostrar:

visualization of list transformation

lo tanto, tengo la lista:

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

Mi mejor enfoque hasta ahora es:

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

de salida:

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

Aunque no estoy lejos ... todavía no estoy allí y agradecería algunas sugerencias.

+0

lo tanto, el tipo de '' xxs' es [(String, String, [(Integer, String, String)])] '? ¿Por qué exactamente tienes un valor tan horrendo para empezar? –

+0

Bueno ... es tarea. :/ – Nomics

Respuesta

7

El problema con su solución es que aux es el mismo para cada elemento de xxs. cuando escribe (x,y,_) <- xxs, está descartando la lista con los números que desea sumar. En su lugar, mantener esa lista, trabajando un elemento a la vez, así:

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

para hallar la suma de las innerList s, sólo desea que los números, por lo que se puede tirar a la basura. Después de que se hace, lo que queda es una lista de números, que solo se puede resumir con la función estándar sum:

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

No es que estamos utilizando fst3 aquí, en lugar de fst, ya que estos son triples, no pares.

+0

'lista doSum = suma (lista Fst3)' esta línea tiene un error. Pero tal vez es lo correcto para la tarea :-) – luqui

+0

Oh, joder. Lo edité para mostrar. – gereeter

4

¡Estabas muy cerca!

Como dijo el gereeter: su problema principal es que está usando el mismo valor de aux para todo. Si cambia aux en una función tomando la lista de tuplas (Int,String,String), entonces debería funcionar para usted.

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

(realmente no he añadido nada a la respuesta de gereeter excepto para cambiar la forma del código de ejemplo para parecerse más a la suya.)

Cuestiones relacionadas