Why is there no Monoid instance for Either?

Hi, Lately, I found myself wanting to use the following Monoid instance: ```` instance (Monoid b) => Monoid (Either a b) where mempty = Right mempty Left e `mappend` _ = Left e _ `mappend` Left e = Left e Right x `mappend` Right y = Right (x `mappend` y) ```` It would seem quite justified to me, given the left-bias of Either elsewhere in base. Is there any particular reason why it shouldn't be defined? It would break the instance for Either in `semigroups`, which is ```` instance Semigroup (Either a b) where Left _ <> b = b a <> _ = a ```` But I think mine is more useful, and has the additional advantage of having `mappend` to behave very similar to the `mappend` for `Maybe`. Francesco

Hi Francesco, maybe you should add the use cases you have in mind, to strengthen your case. A priori, it is not clear why an error-propagating monoid should be preferred over an error-correcting one. (Both seem useful.) Your proposal has the flavor of "All" whereas the Semigroup one corresponds to "Any". Personally, I think neither of the alternatives is sufficiently canonical (both versions throw away information), thus, there shouldn't be instances (also not for Semigroup). Cheers, Andreas On 27.11.2014 18:29, Francesco Mazzoli wrote:
Hi,
Lately, I found myself wanting to use the following Monoid instance:
```` instance (Monoid b) => Monoid (Either a b) where mempty = Right mempty
Left e `mappend` _ = Left e _ `mappend` Left e = Left e Right x `mappend` Right y = Right (x `mappend` y) ````
It would seem quite justified to me, given the left-bias of Either elsewhere in base. Is there any particular reason why it shouldn't be defined?
It would break the instance for Either in `semigroups`, which is
```` instance Semigroup (Either a b) where Left _ <> b = b a <> _ = a ````
But I think mine is more useful, and has the additional advantage of having `mappend` to behave very similar to the `mappend` for `Maybe`.
Francesco _______________________________________________ Libraries mailing list Libraries@haskell.org http://www.haskell.org/mailman/listinfo/libraries
-- Andreas Abel <>< Du bist der geliebte Mensch. Department of Computer Science and Engineering Chalmers and Gothenburg University, Sweden andreas.abel@gu.se http://www2.tcs.ifi.lmu.de/~abel/

Hi Andreas,
Well, we still made the decision to have a similarly arbitrary
instance for `Maybe`, so I thought that instance might be justified
too.
My use case: I'm traversing terms and I want to either collect
meta-variables, or fail. So I'd like to use `Either Error
MetaVariables` to automatically handle the merging of results for
subterms. In the end I defined my own type:
https://github.com/bitonic/tog/blob/master/src/Data/Collect.hs.
Francesco
On 27 November 2014 at 18:45, Andreas Abel
Hi Francesco,
maybe you should add the use cases you have in mind, to strengthen your case.
A priori, it is not clear why an error-propagating monoid should be preferred over an error-correcting one. (Both seem useful.) Your proposal has the flavor of "All" whereas the Semigroup one corresponds to "Any".
Personally, I think neither of the alternatives is sufficiently canonical (both versions throw away information), thus, there shouldn't be instances (also not for Semigroup).
Cheers, Andreas
On 27.11.2014 18:29, Francesco Mazzoli wrote:
Hi,
Lately, I found myself wanting to use the following Monoid instance:
```` instance (Monoid b) => Monoid (Either a b) where mempty = Right mempty
Left e `mappend` _ = Left e _ `mappend` Left e = Left e Right x `mappend` Right y = Right (x `mappend` y) ````
It would seem quite justified to me, given the left-bias of Either elsewhere in base. Is there any particular reason why it shouldn't be defined?
It would break the instance for Either in `semigroups`, which is
```` instance Semigroup (Either a b) where Left _ <> b = b a <> _ = a ````
But I think mine is more useful, and has the additional advantage of having `mappend` to behave very similar to the `mappend` for `Maybe`.
Francesco _______________________________________________ Libraries mailing list Libraries@haskell.org http://www.haskell.org/mailman/listinfo/libraries
-- Andreas Abel <>< Du bist der geliebte Mensch.
Department of Computer Science and Engineering Chalmers and Gothenburg University, Sweden
andreas.abel@gu.se http://www2.tcs.ifi.lmu.de/~abel/
participants (2)
-
Andreas Abel
-
Francesco Mazzoli