union,unionBy
Listの中の
union :: (Eq a) => [a] -> [a] -> [a]
union = unionBy (==)unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]
unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs
となっているがunionという名前をつけるならunionByを
(nubBy eq xs) ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs
とした方がいいような気がするなぁ。
intersectに関しても同様で一つ目のリストで重複する要素があっても、二つ目のリストでその要素と一致するものがあれば全て結果のリストに含まれてしまう。例えばHugsで
List> intersect [1,1,2,3] [1,2]
[1,1,2] :: [Integer]
となる。前のunionも含めてこれらは多重集合の演算と考えればいいのかもしれないが
List> intersect [1,2] [1,1,2,3]
[1,2] :: [Integer]
となってしまう。これでは第一引数のリストと第二引数のリストが対等な扱いになっていない。これってどうなんだろう?