haskell-commutative-semigroups