2011-12-15 12 views
11

私はリストxxsを持っています。古いリストから要素を追加して合計する新しいものを作成する必要があります。古いリストから要素を追加して合計する新しいリストを作成する

私は証明するために、それを描画してみましょう:

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] 

出力

visualization of list transformation

をだから、私はリストを持っています:

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

私は遠く離れていませんが、私はまだそこにいませんし、いくつかの提案を本当に感謝します。

+0

のでxxs' 'のタイプ(文字列、['です文字列、[(整数、文字列、文字列)])] '?なぜあなたはそのような恐ろしいタイプの価値を持っているのですか? –

+0

まあ...それは宿題です。 :/ – Nomics

答えて

7

解決策の問題はauxxxsの各要素で同じことです。 (x,y,_) <- xxsと書くと、合計したい数字のリストが投げ捨てられます。代わりに、そう、一度に一つの要素を取り組んで、そのリストを保つ:あなたがそれらを捨てることができるように

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

innerList秒の合計を見つけるには、あなただけの、数字が欲しいです。これらはトリプルがあるとして、未

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

私たちが代わりにfstの、ここfst3を使用していることではない。それが完了したら、あなただけの標準sum機能を要約することができます番号のリスト、と残っていますペア。

+0

'doSum list = sum(Fst3 list)'この行にはエラーがあります。しかし、それは宿題のためにちょうど正しいかもしれません:-) – luqui

+0

ああ、whoops。私はそれを編集するために編集しました。 – gereeter

4

あなたは本当に近いです!

ジェレーターが言ったように、あなたの主な問題は、すべて同じ値のauxを使用しているということです。 aux(Int,String,String)タプルのリストを取る関数に変更すると、それはうまくいくはずです。

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

(私は実際より密接にあなたに似ているために、サンプルコードの形式を変更する以外gereeterの答えには何も追加されていない。)

関連する問題