Discussion:
Alternative instance for Either
Nathan van Doorn
2018-06-14 10:37:24 UTC
Permalink
Proposal: add:

instance Monoid e => Alternative (Either e) where
empty = Left mempty
Left a <|> Left b = Left (a `mappend` b)
Right a <|> _ = Right a
_ <|> Right b = Right b

instance Monoid e => MonadPlus (Either e) where
...

to base.

This is a reasonably obvious instance which I am pretty sure is law abiding.

It'd be useful for defining a series of computations which may fail, where
we only care about one success.
Tony Morris
2018-06-14 10:42:06 UTC
Permalink
Alternatively :) or more like, something to think about, an Alt instance
for Either.

class Alt f where
  (<!>) :: f a -> f a -> f a

instance Alt Either where
  Right b <!> _ = Right b
  Left a <!> x = x

https://hackage.haskell.org/package/semigroupoids/docs/Data-Functor-Alt.html

There is something iffy about Monoid e => Alternative (Either e) but I
can't put my finger on it.
Post by Nathan van Doorn
instance Monoid e => Alternative (Either e) where
  empty = Left mempty
  Left a <|> Left b = Left (a `mappend` b)
  Right a <|> _ = Right a
  _ <|> Right b = Right b
instance Monoid e => MonadPlus (Either e) where
  ...
to base.
This is a reasonably obvious instance which I am pretty sure is law abiding.
It'd be useful for defining a series of computations which may fail,
where we only care about one success.
_______________________________________________
Libraries mailing list
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Chris Wong
2018-06-15 23:44:37 UTC
Permalink
I think the iffy feeling comes from the proposal breaking the distributive
law. For example:

(Right f <|> Right g) <*> Left x
= Left x

but

(Right f <*> Left x) <|> (Right g <*> Left x)
= Left (x <> x)
Post by Tony Morris
Alternatively :) or more like, something to think about, an Alt instance
for Either.
class Alt f where
(<!>) :: f a -> f a -> f a
instance Alt Either where
Right b <!> _ = Right b
Left a <!> x = x
https://hackage.haskell.org/package/semigroupoids/docs/Data-Functor-Alt.html
There is something iffy about Monoid e => Alternative (Either e) but I
can't put my finger on it.
instance Monoid e => Alternative (Either e) where
empty = Left mempty
Left a <|> Left b = Left (a `mappend` b)
Right a <|> _ = Right a
_ <|> Right b = Right b
instance Monoid e => MonadPlus (Either e) where
...
to base.
This is a reasonably obvious instance which I am pretty sure is law abiding.
It'd be useful for defining a series of computations which may fail, where
we only care about one success.
_______________________________________________
_______________________________________________
Libraries mailing list
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Loading...