Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Documentation
The Either
type represents values with two possibilities: a value of
type
is either Either
a b
or Left
a
.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
The type
is the type of values which can be either
a Either
String
Int
String
or an Int
. The Left
constructor can be used only on
String
s, and the Right
constructor can be used only on Int
s:
>>>
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 Int
s.
>>>
:{
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"
Instances
FromJSON2 Either | |
Defined in Data.Aeson.Types.FromJSON liftParseJSON2 ∷ Maybe a → (Value → Parser a) → (Value → Parser [a]) → Maybe b → (Value → Parser b) → (Value → Parser [b]) → Value → Parser (Either a b) Source # liftParseJSONList2 ∷ Maybe a → (Value → Parser a) → (Value → Parser [a]) → Maybe b → (Value → Parser b) → (Value → Parser [b]) → Value → Parser [Either a b] Source # liftOmittedField2 ∷ Maybe a → Maybe b → Maybe (Either a b) Source # | |
ToJSON2 Either | |
Defined in Data.Aeson.Types.ToJSON liftToJSON2 ∷ (a → Bool) → (a → Value) → ([a] → Value) → (b → Bool) → (b → Value) → ([b] → Value) → Either a b → Value Source # liftToJSONList2 ∷ (a → Bool) → (a → Value) → ([a] → Value) → (b → Bool) → (b → Value) → ([b] → Value) → [Either a b] → Value Source # liftToEncoding2 ∷ (a → Bool) → (a → Encoding) → ([a] → Encoding) → (b → Bool) → (b → Encoding) → ([b] → Encoding) → Either a b → Encoding Source # liftToEncodingList2 ∷ (a → Bool) → (a → Encoding) → ([a] → Encoding) → (b → Bool) → (b → Encoding) → ([b] → Encoding) → [Either a b] → Encoding Source # liftOmitField2 ∷ (a → Bool) → (b → Bool) → Either a b → Bool Source # | |
Bifunctor Either | Since: base-4.8.0.0 |
NFData2 Either | Since: deepseq-1.4.3.0 |
Defined in Control.DeepSeq | |
Hashable2 Either | |
Bitraversable1 Either | |
Defined in Data.Semigroup.Traversable.Class | |
Generic1 (Either a ∷ Type → Type) | |
MonadError e (Either e) | |
Defined in Control.Monad.Error.Class throwError ∷ e → Either e a Source # catchError ∷ Either e a → (e → Either e a) → Either e a Source # | |
(Typeable DefaultUni a, Typeable DefaultUni b, Lift DefaultUni a, Lift DefaultUni b) ⇒ Lift DefaultUni (Either a b) Source # | |
Defined in PlutusTx.Lift.Instances lift ∷ Either a b → RTCompile DefaultUni fun (Term TyName Name DefaultUni fun ()) Source # | |
(Lift a, Lift b) ⇒ Lift (Either a b ∷ Type) | |
FromJSON a ⇒ FromJSON1 (Either a) | |
Defined in Data.Aeson.Types.FromJSON | |
ToJSON a ⇒ ToJSON1 (Either a) | |
Defined in Data.Aeson.Types.ToJSON liftToJSON ∷ (a0 → Bool) → (a0 → Value) → ([a0] → Value) → Either a a0 → Value Source # liftToJSONList ∷ (a0 → Bool) → (a0 → Value) → ([a0] → Value) → [Either a a0] → Value Source # liftToEncoding ∷ (a0 → Bool) → (a0 → Encoding) → ([a0] → Encoding) → Either a a0 → Encoding Source # liftToEncodingList ∷ (a0 → Bool) → (a0 → Encoding) → ([a0] → Encoding) → [Either a a0] → Encoding Source # | |
Foldable (Either a) | Since: base-4.7.0.0 |
Defined in Data.Foldable fold ∷ Monoid m ⇒ Either a m → m Source # foldMap ∷ Monoid m ⇒ (a0 → m) → Either a a0 → m Source # foldMap' ∷ Monoid m ⇒ (a0 → m) → Either a a0 → m Source # foldr ∷ (a0 → b → b) → b → Either a a0 → b Source # foldr' ∷ (a0 → b → b) → b → Either a a0 → b Source # foldl ∷ (b → a0 → b) → b → Either a a0 → b Source # foldl' ∷ (b → a0 → b) → b → Either a a0 → b Source # foldr1 ∷ (a0 → a0 → a0) → Either a a0 → a0 Source # foldl1 ∷ (a0 → a0 → a0) → Either a a0 → a0 Source # toList ∷ Either a a0 → [a0] Source # null ∷ Either a a0 → Bool Source # length ∷ Either a a0 → Int Source # elem ∷ Eq a0 ⇒ a0 → Either a a0 → Bool Source # maximum ∷ Ord a0 ⇒ Either a a0 → a0 Source # minimum ∷ Ord a0 ⇒ Either a a0 → a0 Source # | |
Traversable (Either a) | Since: base-4.7.0.0 |
Defined in Data.Traversable | |
Applicative (Either e) | Since: base-3.0 |
Functor (Either a) | Since: base-3.0 |
Monad (Either e) | Since: base-4.4.0.0 |
MonadFailure (Either a) | |
NFData a ⇒ NFData1 (Either a) | Since: deepseq-1.4.3.0 |
Defined in Control.DeepSeq | |
Hashable a ⇒ Hashable1 (Either a) | |
Defined in Data.Hashable.Class | |
Applicative (Either a) Source # | |
Foldable (Either c) Source # | |
Defined in PlutusTx.Foldable | |
Functor (Either c) Source # | |
Traversable (Either c) Source # | |
Defined in PlutusTx.Traversable | |
MonadBaseControl (Either e) (Either e) | |
Defined in Control.Monad.Trans.Control type StM (Either e) a | |
(FromJSON a, FromJSON b) ⇒ FromJSON (Either a b) | |
(ToJSON a, ToJSON b) ⇒ ToJSON (Either a b) | |
(Data a, Data b) ⇒ Data (Either a b) | Since: base-4.0.0.0 |
Defined in Data.Data gfoldl ∷ (∀ d b0. Data d ⇒ c (d → b0) → d → c b0) → (∀ g. g → c g) → Either a b → c (Either a b) Source # gunfold ∷ (∀ b0 r. Data b0 ⇒ c (b0 → r) → c r) → (∀ r. r → c r) → Constr → c (Either a b) Source # toConstr ∷ Either a b → Constr Source # dataTypeOf ∷ Either a b → DataType Source # dataCast1 ∷ Typeable t ⇒ (∀ d. Data d ⇒ c (t d)) → Maybe (c (Either a b)) Source # dataCast2 ∷ Typeable t ⇒ (∀ d e. (Data d, Data e) ⇒ c (t d e)) → Maybe (c (Either a b)) Source # gmapT ∷ (∀ b0. Data b0 ⇒ b0 → b0) → Either a b → Either a b Source # gmapQl ∷ (r → r' → r) → r → (∀ d. Data d ⇒ d → r') → Either a b → r Source # gmapQr ∷ ∀ r r'. (r' → r → r) → r → (∀ d. Data d ⇒ d → r') → Either a b → r Source # gmapQ ∷ (∀ d. Data d ⇒ d → u) → Either a b → [u] Source # gmapQi ∷ Int → (∀ d. Data d ⇒ d → u) → Either a b → u Source # gmapM ∷ Monad m ⇒ (∀ d. Data d ⇒ d → m d) → Either a b → m (Either a b) Source # gmapMp ∷ MonadPlus m ⇒ (∀ d. Data d ⇒ d → m d) → Either a b → m (Either a b) Source # gmapMo ∷ MonadPlus m ⇒ (∀ d. Data d ⇒ d → m d) → Either a b → m (Either a b) Source # | |
Semigroup (Either a b) | Since: base-4.9.0.0 |
Generic (Either a b) | |
(Read a, Read b) ⇒ Read (Either a b) | Since: base-3.0 |
(Show a, Show b) ⇒ Show (Either a b) | Since: base-3.0 |
(NFData a, NFData b) ⇒ NFData (Either a b) | |
Defined in Control.DeepSeq | |
(Eq a, Eq b) ⇒ Eq (Either a b) | Since: base-2.1 |
(Ord a, Ord b) ⇒ Ord (Either a b) | Since: base-2.1 |
Defined in Data.Either | |
(Hashable a, Hashable b) ⇒ Hashable (Either a b) | |
MonoFoldable (Either a b) | |
Defined in Data.MonoTraversable ofoldMap ∷ Monoid m ⇒ (Element (Either a b) → m) → Either a b → m Source # ofoldr ∷ (Element (Either a b) → b0 → b0) → b0 → Either a b → b0 Source # ofoldl' ∷ (a0 → Element (Either a b) → a0) → a0 → Either a b → a0 Source # otoList ∷ Either a b → [Element (Either a b)] Source # oall ∷ (Element (Either a b) → Bool) → Either a b → Bool Source # oany ∷ (Element (Either a b) → Bool) → Either a b → Bool Source # onull ∷ Either a b → Bool Source # olength ∷ Either a b → Int Source # olength64 ∷ Either a b → Int64 Source # ocompareLength ∷ Integral i ⇒ Either a b → i → Ordering Source # otraverse_ ∷ Applicative f ⇒ (Element (Either a b) → f b0) → Either a b → f () Source # ofor_ ∷ Applicative f ⇒ Either a b → (Element (Either a b) → f b0) → f () Source # omapM_ ∷ Applicative m ⇒ (Element (Either a b) → m ()) → Either a b → m () Source # oforM_ ∷ Applicative m ⇒ Either a b → (Element (Either a b) → m ()) → m () Source # ofoldlM ∷ Monad m ⇒ (a0 → Element (Either a b) → m a0) → a0 → Either a b → m a0 Source # ofoldMap1Ex ∷ Semigroup m ⇒ (Element (Either a b) → m) → Either a b → m Source # ofoldr1Ex ∷ (Element (Either a b) → Element (Either a b) → Element (Either a b)) → Either a b → Element (Either a b) Source # ofoldl1Ex' ∷ (Element (Either a b) → Element (Either a b) → Element (Either a b)) → Either a b → Element (Either a b) Source # headEx ∷ Either a b → Element (Either a b) Source # lastEx ∷ Either a b → Element (Either a b) Source # unsafeHead ∷ Either a b → Element (Either a b) Source # unsafeLast ∷ Either a b → Element (Either a b) Source # maximumByEx ∷ (Element (Either a b) → Element (Either a b) → Ordering) → Either a b → Element (Either a b) Source # minimumByEx ∷ (Element (Either a b) → Element (Either a b) → Ordering) → Either a b → Element (Either a b) Source # oelem ∷ Element (Either a b) → Either a b → Bool Source # onotElem ∷ Element (Either a b) → Either a b → Bool Source # | |
MonoFunctor (Either a b) | |
MonoPointed (Either a b) | |
MonoTraversable (Either a b) | |
(Eq a, Eq b) ⇒ Eq (Either a b) Source # | |
(FromData a, FromData b) ⇒ FromData (Either a b) Source # | |
Defined in PlutusTx.IsData.Instances fromBuiltinData ∷ BuiltinData → Maybe (Either a b) Source # | |
(ToData a, ToData b) ⇒ ToData (Either a b) Source # | |
Defined in PlutusTx.IsData.Instances toBuiltinData ∷ Either a b → BuiltinData Source # | |
(UnsafeFromData a, UnsafeFromData b) ⇒ UnsafeFromData (Either a b) Source # | |
Defined in PlutusTx.IsData.Instances unsafeFromBuiltinData ∷ BuiltinData → Either a b Source # | |
(Ord a, Ord b) ⇒ Ord (Either a b) Source # | |
Defined in PlutusTx.Ord | |
(Show a, Show b) ⇒ Show (Either a b) Source # | |
Corecursive (Either a b) | |
Defined in Data.Functor.Foldable embed ∷ Base (Either a b) (Either a b) → Either a b Source # ana ∷ (a0 → Base (Either a b) a0) → a0 → Either a b Source # apo ∷ (a0 → Base (Either a b) (Either (Either a b) a0)) → a0 → Either a b Source # postpro ∷ Recursive (Either a b) ⇒ (∀ b0. Base (Either a b) b0 → Base (Either a b) b0) → (a0 → Base (Either a b) a0) → a0 → Either a b Source # gpostpro ∷ (Recursive (Either a b), Monad m) ⇒ (∀ b0. m (Base (Either a b) b0) → Base (Either a b) (m b0)) → (∀ c. Base (Either a b) c → Base (Either a b) c) → (a0 → Base (Either a b) (m a0)) → a0 → Either a b Source # | |
Recursive (Either a b) | |
Defined in Data.Functor.Foldable project ∷ Either a b → Base (Either a b) (Either a b) Source # cata ∷ (Base (Either a b) a0 → a0) → Either a b → a0 Source # para ∷ (Base (Either a b) (Either a b, a0) → a0) → Either a b → a0 Source # gpara ∷ (Corecursive (Either a b), Comonad w) ⇒ (∀ b0. Base (Either a b) (w b0) → w (Base (Either a b) b0)) → (Base (Either a b) (EnvT (Either a b) w a0) → a0) → Either a b → a0 Source # prepro ∷ Corecursive (Either a b) ⇒ (∀ b0. Base (Either a b) b0 → Base (Either a b) b0) → (Base (Either a b) a0 → a0) → Either a b → a0 Source # gprepro ∷ (Corecursive (Either a b), Comonad w) ⇒ (∀ b0. Base (Either a b) (w b0) → w (Base (Either a b) b0)) → (∀ c. Base (Either a b) c → Base (Either a b) c) → (Base (Either a b) (w a0) → a0) → Either a b → a0 Source # | |
(Serialise a, Serialise b) ⇒ Serialise (Either a b) | Since: serialise-0.2.0.0 |
(HasBlueprintDefinition a, HasSchemaDefinition a referencedTypes, HasBlueprintDefinition b, HasSchemaDefinition b referencedTypes) ⇒ HasBlueprintSchema (Either a b) referencedTypes Source # | |
Defined in PlutusTx.IsData.Instances | |
Typeable DefaultUni Either Source # | |
Defined in PlutusTx.Lift.Instances typeRep ∷ Proxy Either → RTCompile DefaultUni fun (Type TyName DefaultUni ()) Source # | |
(a ~ a', b ~ b') ⇒ Each (Either a a') (Either b b') a b | |
Defined in Control.Lens.Each | |
(a ~ a', b ~ b') ⇒ Each (Either a a') (Either b b') a b | Since: microlens-0.4.11 |
(FoldableWithIndex i f, FoldableWithIndex j g) ⇒ FoldableWithIndex (Either i j) (Product f g) | |
Defined in WithIndex | |
(FoldableWithIndex i f, FoldableWithIndex j g) ⇒ FoldableWithIndex (Either i j) (Sum f g) | |
(FoldableWithIndex i f, FoldableWithIndex j g) ⇒ FoldableWithIndex (Either i j) (f :*: g) | |
Defined in WithIndex | |
(FoldableWithIndex i f, FoldableWithIndex j g) ⇒ FoldableWithIndex (Either i j) (f :+: g) | |
Defined in WithIndex | |
(FunctorWithIndex i f, FunctorWithIndex j g) ⇒ FunctorWithIndex (Either i j) (Product f g) | |
(FunctorWithIndex i f, FunctorWithIndex j g) ⇒ FunctorWithIndex (Either i j) (Sum f g) | |
(FunctorWithIndex i f, FunctorWithIndex j g) ⇒ FunctorWithIndex (Either i j) (f :*: g) | |
(FunctorWithIndex i f, FunctorWithIndex j g) ⇒ FunctorWithIndex (Either i j) (f :+: g) | |
(TraversableWithIndex i f, TraversableWithIndex j g) ⇒ TraversableWithIndex (Either i j) (Product f g) | |
(TraversableWithIndex i f, TraversableWithIndex j g) ⇒ TraversableWithIndex (Either i j) (Sum f g) | |
(TraversableWithIndex i f, TraversableWithIndex j g) ⇒ TraversableWithIndex (Either i j) (f :*: g) | |
(TraversableWithIndex i f, TraversableWithIndex j g) ⇒ TraversableWithIndex (Either i j) (f :+: g) | |
type Rep1 (Either a ∷ Type → Type) | Since: base-4.6.0.0 |
Defined in GHC.Generics type Rep1 (Either a ∷ Type → Type) = 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 Failure (Either a) | |
Defined in Basement.Monad type Failure (Either a) = a | |
type StM (Either e) a | |
Defined in Control.Monad.Trans.Control type StM (Either e) a = a | |
type Rep (Either a b) | Since: base-4.6.0.0 |
Defined 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))) | |
type Element (Either a b) | |
Defined in Data.MonoTraversable | |
type Base (Either a b) | Example boring stub for non-recursive data types |