<div dir="ltr"><div>The Semigroup and Monoid instances for Either have surprising behaviors. Currently, the Semigroup instance is written as:<br><br>instance Semigroup (Either a b) where</div><div>  Left _ <> b = b</div><div>  a <> _ = a</div><div><br></div><div>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:</div><div><br></div><div>instance Semigroup b => Semigroup (Either a b) where</div><div>  (<>) = liftA2 (<>)</div><div><br></div><div>And now the behaviors match. This generalizes the old Semigroup instance, which could be recovered with `Either a (Data.Semigroup.First b)`.</div><div><br></div><div>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.</div><div><br><div class="gmail_signature" data-smartmail="gmail_signature">-Andrew Thaddeus Martin</div>
</div></div>