
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