The Semigroup and Monoid instances for Either have surprising behaviors. Currently, the Semigroup instance is written as:
instance Semigroup (Either a b) where
Left _ <> b = b
a <> _ = a
One would expect that the Semigroup instances for `Maybe a` and `Either () a` would have the same behaviors, but they don't. We could do better with:
instance Semigroup b => Semigroup (Either a b) where
(<>) = liftA2 (<>)
And now the behaviors match. This generalizes the old Semigroup instance, which could be recovered with `Either a (Data.Semigroup.First b)`.
For now, all I'm proposing is removing the existing Semigroup and Monoid instances for Either. I do not believe that new instances should be given immidiately, since that would be the worst kind of breaking change: one that the compiler does not error on.