monoid -> semigroup