Either
The Either type represents values with two possibilities: a value of type Either a b is either Left a or Right b.
The Either type is sometimes used to represent a value which is either correct or an error; by convention, the Left constructor is used to hold an error value and the Right constructor is used to hold a correct value (mnemonic: "right" also means "correct").
Case analysis for the Either type. If the value is Left a, apply the first function to a; if it is Right b, apply the second function to b.
The Either type, and associated operations.
Haskell 98 either monad transformer
Version 0.3.0.1
Functions for probing and unwrapping values inside of Either.
Version 1.1
Support for computations with informative failures.
Version 0.2.0
Partitions a list of Either into two lists All the Left elements are extracted, in order, to the first component of the output. Similarly the Right elements are extracted to the second component of the output.
O(n). Map values and separate the Left and Right results.
> let f a = if a < "c" then Left a else Right a
> mapEither f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
> == (fromList [(3,"b"), (5,"a")], fromList [(1,"x"), (7,"z")])
>
> mapEither (\ a -> Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
> == (empty, fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
O(n). Map values and separate the Left and Right results.
> let f a = if a < "c" then Left a else Right a
> mapEither f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
> == (fromList [(3,"b"), (5,"a")], fromList [(1,"x"), (7,"z")])
>
> mapEither (\ a -> Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
> == (empty, fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
O(n). Map keys/values and separate the Left and Right results.
> let f k a = if k < 5 then Left (k * 2) else Right (a ++ a)
> mapEitherWithKey f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
> == (fromList [(1,2), (3,6)], fromList [(5,"aa"), (7,"zz")])
>
> mapEitherWithKey (\_ a -> Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
> == (empty, fromList [(1,"x"), (3,"b"), (5,"a"), (7,"z")])
O(n). Map keys/values and separate the Left and Right results.
> let f k a = if k < 5 then Left (k * 2) else Right (a ++ a)
> mapEitherWithKey f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
> == (fromList [(1,2), (3,6)], fromList [(5,"aa"), (7,"zz")])
>
> mapEitherWithKey (\_ a -> Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])
> == (empty, fromList [(1,"x"), (3,"b"), (5,"a"), (7,"z")])
The standard Either datatype suffers from a lack of monad and applicative instances. To make matters worse, the mtl and transformers packages provide orphan instances which conflict with each other, as well as defining a transformer version which has an usually unnecessary superclass constraint.
Besides these annoyances, there is another issue: there exist two reasonable definitions of the Applicative instance for Either: one the holds onto only the first Left value, or one that appends all Left values together via a Monoid instance. The former is compatible with the monad instance, while the latter is not.
This package defines three datatypes, some helpers functions and instances. The data types are AEither, MEither and MEitherT. AEither provides an Applicative instance which appends Left values, MEither provides the monadic definition, and MEitherT is a monad transformer.
Version 0.3.1.1