Haskellのお勉強 group byしてsum
タプルで1要素目を元にsum(group byするイメージ)してみる
こんなデータがあったとする
名前 | 数 |
---|---|
Tarou | 10 |
Hanako | 20 |
Jirou | 30 |
Tarou | 40 |
Hanako | 50 |
Saburou | 60 |
Hanako | 70 |
これをTarouは50、Hanakoは140、Jirouは30、Saburouは60という結果を得たい
とりあえず作戦として1要素目でソートして、nとn+1の1要素目を比べて合ってたら足す、そんで残りを再帰する感じ
一応でけた
import Data.List main = do let xs = [ ("Tarou", 10), ("Hanako", 20), ("Jirou", 30), ("Tarou", 40), ("Hanako", 50), ("Saburou", 60), ("Hanako", 70) ] print $ group_sum $ sortBy (\a b -> compare a b) xs group_sum :: [(String, Int)] -> [(String, Int)] group_sum [] = [] group_sum [(a,b)] = [(a, b)] group_sum ((a,b):(c,d):xs) | a == c = group_sum ([(a, b + d)] ++ xs) | otherwise = [(a, b)] ++ (group_sum ([(c, d)] ++ xs))
やっぱりどうも配列は[]でタプルは()なのが慣れない
どうしても[[a,b],[c,d],xs]とか((a:b):(c:d):xs)とか書いちゃう
どうにかうまい具合に頭ん中スッキリまとめる方法ないもんか
明日は今月のデータを抽出する方法