I don't think the original question really is about commutativity, but rather the choice of Monoid instance.

Not being especially mathematically inclined, every once and a while I
get a little panicked when I notice that, e.g. Data.Map mappend is a
plain left-biased union, and doesn't actually mappend the values of
the map.

As noted in the reply
 
> So there's a range of possible Monoid instances for each type,

More for some types than for others. For Maybe there are three:

 * always take the first/left value;
 * always take the last/right value;
 * or, use a semigroup operation defined on the values.

The first two options are provided by the First and Last newtypes, and the
third option is provided by the instance for Maybe itself (except that it
spuriously requires a Monoid instance instead of just a semigroup).


But why does the Map instance of Monoid _not_ mimic the one chosen for Maybe. I claim this causes unnecessary surprises for users (and lifting the Monoid instance seems more useful, but that is harder to substantiate).

Jens