文字列と数のタプルのリストを合計する関数

もっといい書き方ないんかいな.Preludeとかで用意されてないのか.

union :: [(String,Int)] -> [(String,Int)] -> [(String,Int)]
union xs ys = MS.toOccurList $ MS.union (MS.fromOccurList xs) (MS.fromOccurList ys)

入力例.

print $ union [("aaa",3)] [("aaa",3),("bbb",1)]
=> [("aaa",6),("bbb",1)]

union [("aaa",3),("aaa",1)] [("aaa",3),("bbb",1)] 
=> [("aaa",7),("bbb",1)]

ちなみにモナドに対応メモ.

unionM :: Maybe [(String, Int)] -> Maybe [(String, Int)] -> Maybe [(String, Int)] 
unionM x y = (liftM2  union) x y

print $ unionM (Just [("aaa",3)]) (Just [("aaa",3)])