Proposal: Remove Semigroup and Monoid instances for Data.Map, Data.IntMap, Data.HashMap

Evan Laforge qdunkan at
Thu Feb 15 21:25:56 UTC 2018

On Wed, Feb 14, 2018 at 6:47 AM, Mario Blažević <mblazevic at> wrote:
>         I understand it's hard to grep, but can you guess how many of those
> 40-80 uses of (<>) with the union meaning actually depend on the left-biased
> semantics? I've looked at my code, and it turns out that wherever this
> operation appears, the two maps are guaranteed to have distinct keys.

I know that in a few cases I do explicitly want "left wins", and I do
frequently use (x<>) as a way to accumulate new data.  Sometimes I
expect that new data to override old stuff, sometimes I don't expect
them to overlap, but it's not a problem if they do.  In the cases
where it is a problem (e.g. warn about shadowed names or something), I

Util.Map.unique_union :: Ord k =>
    Map.Map k a -> Map.Map k a -> (Map.Map k a, Map.Map k a)
    -- ^ (union, rejected)

I can grep for that: 3 calls, plus 11 more for the version that takes
[(k, a)].  However, in the absence of actual numbers for (<>), don't
take me too seriously.  These kinds of feelings are often shown wrong
by the real numbers.  But even if I could count them, it's not like it
proves anything.  It comes down to style and problem domain.

That said though, is there a way to grep for methods overloaded at a
certain type?  One thing I thought of was recompile Data.Map with a
TypeError instance, but it seems it might be a hassle for a base
package like containers.  Otherwise I imagine you could parse core,
look for resolved methods, and map back to file and line.  Is there a
general purpose core analysis suite out there?

>         There is actually one use I'm not sure about, I'll have to make sure
> there's no bug hiding there. That is one reason I'm supporting the proposal,
> by the way: the existing behaviour that silently drops values is much more
> likely to cause bugs.

It's true it does, but since I think of (<>) as union, and union does
that too, it doesn't surprise me.  Actually the surprising thing was
that Map.union is left-biased, while it seems like most languages go
the other way.  But that was just a general haskell oddity that I
accustomed myself to many years ago.

More information about the Libraries mailing list