読者です 読者をやめる 読者になる 読者になる

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)とか書いちゃう
どうにかうまい具合に頭ん中スッキリまとめる方法ないもんか


明日は今月のデータを抽出する方法