planet-mitchell-0.1.0: Planet Mitchell

Either

Contents

Synopsis

Documentation

data Either a b #

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").

Examples

Expand

The type Either String Int is the type of values which can be either a String or an Int. The Left constructor can be used only on Strings, and the Right constructor can be used only on Ints:

>>> let s = Left "foo" :: Either String Int
>>> s
Left "foo"
>>> let n = Right 3 :: Either String Int
>>> n
Right 3
>>> :type s
s :: Either String Int
>>> :type n
n :: Either String Int


The fmap from our Functor instance will ignore Left values, but will apply the supplied function to values contained in a Right:

>>> let s = Left "foo" :: Either String Int
>>> let n = Right 3 :: Either String Int
>>> fmap (*2) s
Left "foo"
>>> fmap (*2) n
Right 6


The Monad instance for Either allows us to chain together multiple actions which may fail, and fail overall if any of the individual steps failed. First we'll write a function that can either parse an Int from a Char, or fail.

>>> import Data.Char ( digitToInt, isDigit )
>>> :{
    let parseEither :: Char -> Either String Int
parseEither c
| isDigit c = Right (digitToInt c)
| otherwise = Left "parse error"
>>> :}


The following should work, since both '1' and '2' can be parsed as Ints.

>>> :{
    let parseMultiple :: Either String Int
parseMultiple = do
x <- parseEither '1'
y <- parseEither '2'
return (x + y)
>>> :}

>>> parseMultiple
Right 3


But the following should fail overall, since the first operation where we attempt to parse 'm' as an Int will fail:

>>> :{
    let parseMultiple :: Either String Int
parseMultiple = do
x <- parseEither 'm'
y <- parseEither '2'
return (x + y)
>>> :}

>>> parseMultiple
Left "parse error"


Constructors

 Left a Right b
Instances
 Instance detailsDefined in Data.Aeson.Types.ToJSON MethodsliftToJSON2 :: (a -> Value) -> ([a] -> Value) -> (b -> Value) -> ([b] -> Value) -> Either a b -> Value #liftToJSONList2 :: (a -> Value) -> ([a] -> Value) -> (b -> Value) -> ([b] -> Value) -> [Either a b] -> Value #liftToEncoding2 :: (a -> Encoding) -> ([a] -> Encoding) -> (b -> Encoding) -> ([b] -> Encoding) -> Either a b -> Encoding #liftToEncodingList2 :: (a -> Encoding) -> ([a] -> Encoding) -> (b -> Encoding) -> ([b] -> Encoding) -> [Either a b] -> Encoding # Instance detailsDefined in Data.Aeson.Types.FromJSON MethodsliftParseJSON2 :: (Value -> Parser a) -> (Value -> Parser [a]) -> (Value -> Parser b) -> (Value -> Parser [b]) -> Value -> Parser (Either a b) #liftParseJSONList2 :: (Value -> Parser a) -> (Value -> Parser [a]) -> (Value -> Parser b) -> (Value -> Parser [b]) -> Value -> Parser [Either a b] # Since: base-4.10.0.0 Instance detailsDefined in Data.Bitraversable Methodsbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> Either a b -> f (Either c d) # Since: base-4.10.0.0 Instance detailsDefined in Data.Bifoldable Methodsbifold :: Monoid m => Either m m -> m #bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> Either a b -> m #bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> Either a b -> c #bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> Either a b -> c # Since: base-4.8.0.0 Instance detailsDefined in Data.Bifunctor Methodsbimap :: (a -> b) -> (c -> d) -> Either a c -> Either b d #first :: (a -> b) -> Either a c -> Either b c #second :: (b -> c) -> Either a b -> Either a c # Since: base-4.9.0.0 Instance detailsDefined in Data.Functor.Classes MethodsliftEq2 :: (a -> b -> Bool) -> (c -> d -> Bool) -> Either a c -> Either b d -> Bool # Since: base-4.9.0.0 Instance detailsDefined in Data.Functor.Classes MethodsliftCompare2 :: (a -> b -> Ordering) -> (c -> d -> Ordering) -> Either a c -> Either b d -> Ordering # Since: base-4.9.0.0 Instance detailsDefined in Data.Functor.Classes MethodsliftReadsPrec2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> Int -> ReadS (Either a b) #liftReadList2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> ReadS [Either a b] #liftReadPrec2 :: ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec (Either a b) #liftReadListPrec2 :: ReadPrec a -> ReadPrec [a] -> ReadPrec b -> ReadPrec [b] -> ReadPrec [Either a b] # Since: base-4.9.0.0 Instance detailsDefined in Data.Functor.Classes MethodsliftShowsPrec2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> (Int -> b -> ShowS) -> ([b] -> ShowS) -> Int -> Either a b -> ShowS #liftShowList2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> (Int -> b -> ShowS) -> ([b] -> ShowS) -> [Either a b] -> ShowS # Since: deepseq-1.4.3.0 Instance detailsDefined in Control.DeepSeq MethodsliftRnf2 :: (a -> ()) -> (b -> ()) -> Either a b -> () # Instance detailsDefined in Data.Hashable.Class MethodsliftHashWithSalt2 :: (Int -> a -> Int) -> (Int -> b -> Int) -> Int -> Either a b -> Int # Instance detailsDefined in Data.Semigroup.Traversable.Class Methodsbitraverse1 :: Apply f => (a -> f b) -> (c -> f d) -> Either a c -> f (Either b d) #bisequence1 :: Apply f => Either (f a) (f b) -> f (Either a b) # Instance detailsDefined in Control.Lens.Iso Methodsswapped :: (Profunctor p, Functor f) => p (Either b a) (f (Either d c)) -> p (Either a b) (f (Either c d)) # Instance detailsDefined in Data.Semigroup.Foldable.Class Methodsbifold1 :: Semigroup m => Either m m -> m #bifoldMap1 :: Semigroup m => (a -> m) -> (b -> m) -> Either a b -> m # () :=> (Monad (Either a)) Instance detailsDefined in Data.Constraint Methodsins :: () :- Monad (Either a) # () :=> (Functor (Either a)) Instance detailsDefined in Data.Constraint Methodsins :: () :- Functor (Either a) # () :=> (Applicative (Either a)) Instance detailsDefined in Data.Constraint Methodsins :: () :- Applicative (Either a) # MonadError e (Either e) Instance detailsDefined in Control.Monad.Error.Class MethodsthrowError :: e -> Either e a #catchError :: Either e a -> (e -> Either e a) -> Either e a # Monad (Either e) Since: base-4.4.0.0 Instance detailsDefined in Data.Either Methods(>>=) :: Either e a -> (a -> Either e b) -> Either e b #(>>) :: Either e a -> Either e b -> Either e b #return :: a -> Either e a #fail :: String -> Either e a # Since: base-3.0 Instance detailsDefined in Data.Either Methodsfmap :: (a0 -> b) -> Either a a0 -> Either a b #(<$) :: a0 -> Either a b -> Either a a0 # Since: base-4.3.0.0 Instance detailsDefined in Control.Monad.Fix Methodsmfix :: (a -> Either e a) -> Either e a # Since: base-3.0 Instance detailsDefined in Data.Either Methodspure :: a -> Either e a #(<*>) :: Either e (a -> b) -> Either e a -> Either e b #liftA2 :: (a -> b -> c) -> Either e a -> Either e b -> Either e c #(*>) :: Either e a -> Either e b -> Either e b #(<*) :: Either e a -> Either e b -> Either e a # Since: base-4.7.0.0 Instance detailsDefined in Data.Foldable Methodsfold :: Monoid m => Either a m -> m #foldMap :: Monoid m => (a0 -> m) -> Either a a0 -> m #foldr :: (a0 -> b -> b) -> b -> Either a a0 -> b #foldr' :: (a0 -> b -> b) -> b -> Either a a0 -> b #foldl :: (b -> a0 -> b) -> b -> Either a a0 -> b #foldl' :: (b -> a0 -> b) -> b -> Either a a0 -> b #foldr1 :: (a0 -> a0 -> a0) -> Either a a0 -> a0 #foldl1 :: (a0 -> a0 -> a0) -> Either a a0 -> a0 #toList :: Either a a0 -> [a0] #null :: Either a a0 -> Bool #length :: Either a a0 -> Int #elem :: Eq a0 => a0 -> Either a a0 -> Bool #maximum :: Ord a0 => Either a a0 -> a0 #minimum :: Ord a0 => Either a a0 -> a0 #sum :: Num a0 => Either a a0 -> a0 #product :: Num a0 => Either a a0 -> a0 # Since: base-4.7.0.0 Instance detailsDefined in Data.Traversable Methodstraverse :: Applicative f => (a0 -> f b) -> Either a a0 -> f (Either a b) #sequenceA :: Applicative f => Either a (f a0) -> f (Either a a0) #mapM :: Monad m => (a0 -> m b) -> Either a a0 -> m (Either a b) #sequence :: Monad m => Either a (m a0) -> m (Either a a0) # ToJSON a => ToJSON1 (Either a) Instance detailsDefined in Data.Aeson.Types.ToJSON MethodsliftToJSON :: (a0 -> Value) -> ([a0] -> Value) -> Either a a0 -> Value #liftToJSONList :: (a0 -> Value) -> ([a0] -> Value) -> [Either a a0] -> Value #liftToEncoding :: (a0 -> Encoding) -> ([a0] -> Encoding) -> Either a a0 -> Encoding #liftToEncodingList :: (a0 -> Encoding) -> ([a0] -> Encoding) -> [Either a a0] -> Encoding # FromJSON a => FromJSON1 (Either a) Instance detailsDefined in Data.Aeson.Types.FromJSON MethodsliftParseJSON :: (Value -> Parser a0) -> (Value -> Parser [a0]) -> Value -> Parser (Either a a0) #liftParseJSONList :: (Value -> Parser a0) -> (Value -> Parser [a0]) -> Value -> Parser [Either a a0] # Eq a => Eq1 (Either a) Since: base-4.9.0.0 Instance detailsDefined in Data.Functor.Classes MethodsliftEq :: (a0 -> b -> Bool) -> Either a a0 -> Either a b -> Bool # Ord a => Ord1 (Either a) Since: base-4.9.0.0 Instance detailsDefined in Data.Functor.Classes MethodsliftCompare :: (a0 -> b -> Ordering) -> Either a a0 -> Either a b -> Ordering # Read a => Read1 (Either a) Since: base-4.9.0.0 Instance detailsDefined in Data.Functor.Classes MethodsliftReadsPrec :: (Int -> ReadS a0) -> ReadS [a0] -> Int -> ReadS (Either a a0) #liftReadList :: (Int -> ReadS a0) -> ReadS [a0] -> ReadS [Either a a0] #liftReadPrec :: ReadPrec a0 -> ReadPrec [a0] -> ReadPrec (Either a a0) #liftReadListPrec :: ReadPrec a0 -> ReadPrec [a0] -> ReadPrec [Either a a0] # Show a => Show1 (Either a) Since: base-4.9.0.0 Instance detailsDefined in Data.Functor.Classes MethodsliftShowsPrec :: (Int -> a0 -> ShowS) -> ([a0] -> ShowS) -> Int -> Either a a0 -> ShowS #liftShowList :: (Int -> a0 -> ShowS) -> ([a0] -> ShowS) -> [Either a a0] -> ShowS # Monoid m => Compactable (Either m) Instance detailsDefined in Control.Compactable Methodscompact :: Either m (Maybe a) -> Either m a #separate :: Either m (Either l r) -> (Either m l, Either m r) #filter :: (a -> Bool) -> Either m a -> Either m a #partition :: (a -> Bool) -> Either m a -> (Either m a, Either m a) #fmapMaybe :: Functor (Either m) => (a -> Maybe b) -> Either m a -> Either m b #fmapEither :: Functor (Either m) => (a -> Either l r) -> Either m a -> (Either m l, Either m r) #applyMaybe :: Applicative (Either m) => Either m (a -> Maybe b) -> Either m a -> Either m b #applyEither :: Applicative (Either m) => Either m (a -> Either l r) -> Either m a -> (Either m l, Either m r) #bindMaybe :: Monad (Either m) => Either m a -> (a -> Either m (Maybe b)) -> Either m b #bindEither :: Monad (Either m) => Either m a -> (a -> Either m (Either l r)) -> (Either m l, Either m r) #traverseMaybe :: (Applicative g, Traversable (Either m)) => (a -> g (Maybe b)) -> Either m a -> g (Either m b) #traverseEither :: (Applicative g, Traversable (Either m)) => (a -> g (Either l r)) -> Either m a -> g (Either m l, Either m r) # NFData a => NFData1 (Either a) Since: deepseq-1.4.3.0 Instance detailsDefined in Control.DeepSeq MethodsliftRnf :: (a0 -> ()) -> Either a a0 -> () # e ~ SomeException => MonadThrow (Either e) Instance detailsDefined in Control.Monad.Catch MethodsthrowM :: Exception e0 => e0 -> Either e a # e ~ SomeException => MonadCatch (Either e) Since: exceptions-0.8.3 Instance detailsDefined in Control.Monad.Catch Methodscatch :: Exception e0 => Either e a -> (e0 -> Either e a) -> Either e a # e ~ SomeException => MonadMask (Either e) Since: exceptions-0.8.3 Instance detailsDefined in Control.Monad.Catch Methodsmask :: ((forall a. Either e a -> Either e a) -> Either e b) -> Either e b #uninterruptibleMask :: ((forall a. Either e a -> Either e a) -> Either e b) -> Either e b #generalBracket :: Either e a -> (a -> ExitCase b -> Either e c) -> (a -> Either e b) -> Either e (b, c) # Hashable a => Hashable1 (Either a) Instance detailsDefined in Data.Hashable.Class MethodsliftHashWithSalt :: (Int -> a0 -> Int) -> Int -> Either a a0 -> Int # Apply (Either a) Instance detailsDefined in Data.Functor.Bind.Class Methods(<.>) :: Either a (a0 -> b) -> Either a a0 -> Either a b #(.>) :: Either a a0 -> Either a b -> Either a b #(<.) :: Either a a0 -> Either a b -> Either a a0 #liftF2 :: (a0 -> b -> c) -> Either a a0 -> Either a b -> Either a c # Instance detailsDefined in Data.Pointed Methodspoint :: a0 -> Either a a0 # Alt (Either a) Instance detailsDefined in Data.Functor.Alt Methods() :: Either a a0 -> Either a a0 -> Either a a0 #some :: Applicative (Either a) => Either a a0 -> Either a [a0] #many :: Applicative (Either a) => Either a a0 -> Either a [a0] # Bind (Either a) Instance detailsDefined in Data.Functor.Bind.Class Methods(>>-) :: Either a a0 -> (a0 -> Either a b) -> Either a b #join :: Either a (Either a a0) -> Either a a0 # Extend (Either a) Instance detailsDefined in Data.Functor.Extend Methodsduplicated :: Either a a0 -> Either a (Either a a0) #extended :: (Either a a0 -> b) -> Either a a0 -> Either a b # Generic1 (Either a :: * -> *) Instance detailsDefined in GHC.Generics Associated Typestype Rep1 (Either a) :: k -> * # Methodsfrom1 :: Either a a0 -> Rep1 (Either a) a0 #to1 :: Rep1 (Either a) a0 -> Either a a0 # MonadBase (Either e) (Either e) Instance detailsDefined in Control.Monad.Base MethodsliftBase :: Either e α -> Either e α # (Eq a, Eq b) => Eq (Either a b) Instance detailsDefined in Data.Either Methods(==) :: Either a b -> Either a b -> Bool #(/=) :: Either a b -> Either a b -> Bool # (Data a, Data b) => Data (Either a b) Since: base-4.0.0.0 Instance detailsDefined in Data.Data Methodsgfoldl :: (forall d b0. Data d => c (d -> b0) -> d -> c b0) -> (forall g. g -> c g) -> Either a b -> c (Either a b) #gunfold :: (forall b0 r. Data b0 => c (b0 -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Either a b) #toConstr :: Either a b -> Constr #dataTypeOf :: Either a b -> DataType #dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Either a b)) #dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Either a b)) #gmapT :: (forall b0. Data b0 => b0 -> b0) -> Either a b -> Either a b #gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Either a b -> r #gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Either a b -> r #gmapQ :: (forall d. Data d => d -> u) -> Either a b -> [u] #gmapQi :: Int -> (forall d. Data d => d -> u) -> Either a b -> u #gmapM :: Monad m => (forall d. Data d => d -> m d) -> Either a b -> m (Either a b) #gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Either a b -> m (Either a b) #gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Either a b -> m (Either a b) # (Ord a, Ord b) => Ord (Either a b) Instance detailsDefined in Data.Either Methodscompare :: Either a b -> Either a b -> Ordering #(<) :: Either a b -> Either a b -> Bool #(<=) :: Either a b -> Either a b -> Bool #(>) :: Either a b -> Either a b -> Bool #(>=) :: Either a b -> Either a b -> Bool #max :: Either a b -> Either a b -> Either a b #min :: Either a b -> Either a b -> Either a b # (Read a, Read b) => Read (Either a b) Instance detailsDefined in Data.Either MethodsreadsPrec :: Int -> ReadS (Either a b) #readList :: ReadS [Either a b] #readPrec :: ReadPrec (Either a b) #readListPrec :: ReadPrec [Either a b] # (Show a, Show b) => Show (Either a b) Instance detailsDefined in Data.Either MethodsshowsPrec :: Int -> Either a b -> ShowS #show :: Either a b -> String #showList :: [Either a b] -> ShowS # Generic (Either a b) Instance detailsDefined in GHC.Generics Associated Typestype Rep (Either a b) :: * -> * # Methodsfrom :: Either a b -> Rep (Either a b) x #to :: Rep (Either a b) x -> Either a b # Semigroup (Either a b) Since: base-4.9.0.0 Instance detailsDefined in Data.Either Methods(<>) :: Either a b -> Either a b -> Either a b #sconcat :: NonEmpty (Either a b) -> Either a b #stimes :: Integral b0 => b0 -> Either a b -> Either a b # (Lift a, Lift b) => Lift (Either a b) Instance detailsDefined in Language.Haskell.TH.Syntax Methodslift :: Either a b -> Q Exp # (Hashable a, Hashable b) => Hashable (Either a b) Instance detailsDefined in Data.Hashable.Class MethodshashWithSalt :: Int -> Either a b -> Int #hash :: Either a b -> Int # (ToJSON a, ToJSON b) => ToJSON (Either a b) Instance detailsDefined in Data.Aeson.Types.ToJSON MethodstoJSON :: Either a b -> Value #toEncoding :: Either a b -> Encoding #toJSONList :: [Either a b] -> Value #toEncodingList :: [Either a b] -> Encoding # (FromJSON a, FromJSON b) => FromJSON (Either a b) Instance detailsDefined in Data.Aeson.Types.FromJSON MethodsparseJSON :: Value -> Parser (Either a b) #parseJSONList :: Value -> Parser [Either a b] # (NFData a, NFData b) => NFData (Either a b) Instance detailsDefined in Control.DeepSeq Methodsrnf :: Either a b -> () # (Serialise a, Serialise b) => Serialise (Either a b) Since: serialise-0.2.0.0 Instance detailsDefined in Codec.Serialise.Class Methodsencode :: Either a b -> Encoding #decode :: Decoder s (Either a b) #encodeList :: [Either a b] -> Encoding #decodeList :: Decoder s [Either a b] # (Eq a, Eq b) :=> (Eq (Either a b)) Instance detailsDefined in Data.Constraint Methodsins :: (Eq a, Eq b) :- Eq (Either a b) # (Ord a, Ord b) :=> (Ord (Either a b)) Instance detailsDefined in Data.Constraint Methodsins :: (Ord a, Ord b) :- Ord (Either a b) # (Read a, Read b) :=> (Read (Either a b)) Instance detailsDefined in Data.Constraint Methodsins :: (Read a, Read b) :- Read (Either a b) # (Show a, Show b) :=> (Show (Either a b)) Instance detailsDefined in Data.Constraint Methodsins :: (Show a, Show b) :- Show (Either a b) # type Rep1 (Either a :: * -> *) Instance detailsDefined in GHC.Generics type Rep1 (Either a :: * -> *) = D1 (MetaData "Either" "Data.Either" "base" False) (C1 (MetaCons "Left" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a)) :+: C1 (MetaCons "Right" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) Par1)) type Rep (Either a b) Instance detailsDefined in GHC.Generics type Rep (Either a b) = D1 (MetaData "Either" "Data.Either" "base" False) (C1 (MetaCons "Left" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a)) :+: C1 (MetaCons "Right" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 b))) either :: (a -> c) -> (b -> c) -> Either a b -> c # 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. Examples Expand We create two values of type Either String Int, one using the Left constructor and another using the Right constructor. Then we apply "either" the length function (if we have a String) or the "times-two" function (if we have an Int): >>> let s = Left "foo" :: Either String Int >>> let n = Right 3 :: Either String Int >>> either length (*2) s 3 >>> either length (*2) n 6  eitherM :: Monad m => (a -> m c) -> (b -> m c) -> m (Either a b) -> m c # Monadic generalisation of either. lefts :: [Either a b] -> [a] # Extracts from a list of Either all the Left elements. All the Left elements are extracted in order. Examples Expand Basic usage: >>> let list = [ Left "foo", Right 3, Left "bar", Right 7, Left "baz" ] >>> lefts list ["foo","bar","baz"]  rights :: [Either a b] -> [b] # Extracts from a list of Either all the Right elements. All the Right elements are extracted in order. Examples Expand Basic usage: >>> let list = [ Left "foo", Right 3, Left "bar", Right 7, Left "baz" ] >>> rights list [3,7]  isLeft :: Either a b -> Bool # Return True if the given value is a Left-value, False otherwise. Examples Expand Basic usage: >>> isLeft (Left "foo") True >>> isLeft (Right 3) False  Assuming a Left value signifies some sort of error, we can use isLeft to write a very simple error-reporting function that does absolutely nothing in the case of success, and outputs "ERROR" if any error occurred. This example shows how isLeft might be used to avoid pattern matching when one does not care about the value contained in the constructor: >>> import Control.Monad ( when ) >>> let report e = when (isLeft e)$ putStrLn "ERROR"
>>> report (Right 1)
>>> report (Left "parse error")
ERROR


Since: base-4.7.0.0

isRight :: Either a b -> Bool #

Return True if the given value is a Right-value, False otherwise.

Examples

Expand

Basic usage:

>>> isRight (Left "foo")
False
>>> isRight (Right 3)
True


Assuming a Left value signifies some sort of error, we can use isRight to write a very simple reporting function that only outputs "SUCCESS" when a computation has succeeded.

This example shows how isRight might be used to avoid pattern matching when one does not care about the value contained in the constructor:

>>> import Control.Monad ( when )
>>> let report e = when (isRight e) \$ putStrLn "SUCCESS"
>>> report (Left "parse error")
>>> report (Right 1)
SUCCESS


Since: base-4.7.0.0

fromLeft :: a -> Either a b -> a #

Return the contents of a Left-value or a default value otherwise.

Examples

Expand

Basic usage:

>>> fromLeft 1 (Left 3)
3
>>> fromLeft 1 (Right "foo")
1


Since: base-4.10.0.0

fromRight :: b -> Either a b -> b #

Return the contents of a Right-value or a default value otherwise.

Examples

Expand

Basic usage:

>>> fromRight 1 (Right 3)
3
>>> fromRight 1 (Left "foo")
1


Since: base-4.10.0.0

partitionEithers :: [Either a b] -> ([a], [b]) #

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.

Examples

Expand

Basic usage:

>>> let list = [ Left "foo", Right 3, Left "bar", Right 7, Left "baz" ]
>>> partitionEithers list
(["foo","bar","baz"],[3,7])


The pair returned by partitionEithers x should be the same pair as (lefts x, rights x):

>>> let list = [ Left "foo", Right 3, Left "bar", Right 7, Left "baz" ]
>>> partitionEithers list == (lefts list, rights list)
True


Optics

_Left :: (Choice p, Applicative f) => p a (f b) -> p (Either a c) (f (Either b c)) #

This Prism provides a Traversal for tweaking the Left half of an Either:

>>> over _Left (+1) (Left 2)
Left 3

>>> over _Left (+1) (Right 2)
Right 2

>>> Right 42 ^._Left :: String
""

>>> Left "hello" ^._Left
"hello"


It also can be turned around to obtain the embedding into the Left half of an Either:

>>> _Left # 5
Left 5

>>> 5^.re _Left
Left 5


_Right :: (Choice p, Applicative f) => p a (f b) -> p (Either c a) (f (Either c b)) #

This Prism provides a Traversal for tweaking the Right half of an Either:

>>> over _Right (+1) (Left 2)
Left 2

>>> over _Right (+1) (Right 2)
Right 3

>>> Right "hello" ^._Right
"hello"

>>> Left "hello" ^._Right :: [Double]
[]


It also can be turned around to obtain the embedding into the Right half of an Either:

>>> _Right # 5
Right 5

>>> 5^.re _Right
Right 5