A generic structure for a type with two possibilities: a Left a or
a Right b.
Apply a function to an Either. If the argument is Right, it
will be converted. If the argument is an Left, the same left value
will propogate through.
map ((+) 1) (Left "Hello") == Left "Hello"
map ((+) 1) (Right 2) == Right 3Apply a function to the Left of an Either.
mapLeft ((+) 1) (Left 2) == Left 3
mapLeft ((+) 1) (Right 2) == Right 2Ignore the return value of the Right using the specified value instead.
Exactly the same as <$ in other languages.
voidRight 2 (Right True) == Right 2
voidRight 2 (Left "banana") == Left "banana"Ignore the return value of the Left using the specified value instead.
NOT the same as $> in other languages.
voidLeft "two" (Right True) == Right True
voidLeft "two" (Left 6) == Left "two"Apply the first argument function to a Left and the second
argument function to a Right of an Either.
mapBoth (\s -> s ++ "!!") ((+) 1) (Left "Hello") == Left "Hello!!"
mapBoth (\s -> s ++ "!!") ((+) 1) (Right 2) == Right 3Not crazy on the name, but apply a function to either the Left
or the Right where the Left and the Right are of the same type.
mapEach ((+) 1) (Left 2) == Left 3
mapEach ((+) 1) (Right 3) == Right 4Create a singleton from a value to an Either with a Right
of the same type. Also known as pure. Use the Left constructor
for a singleton of the Left variety.
singleton 2 == Right 2Apply the function that is inside Either to a value that is inside
Either. Return the result inside Either. If one of the Either
arguments is Left x, return Left x. Also known as apply.
Left "Hello" |> andMap (Left "World") == Left "Hello"
Left "Hello" |> andMap (Right 2) == Left "Hello"
Right ((+) 1) |> andMap (Left "World") == Left "World"
Right ((+) 1) |> andMap (Right 2) == Right 3Apply the function that is inside Either to a value that is inside
Either. Return the result inside Either. If one of the Either
arguments is Right x, return Right x. Also known as apply.
Left (\s -> s ++ "!!") |> andMap (Left "Hello") == Left "Hello!!"
Left (\s -> s ++ "!!") |> andMap (Right 2) == Right 2
Right 99 |> andMap (Left "World") == Right 99
Right 99 |> andMap (Right 2) == Right 99Alias for andMap.
Apply a function to two eithers, if both arguments are Right.
If not, the first argument which is a Left will propagate through.
Also known as liftA2.
map2 (+) (Left "Hello") (Left "World") == Left "Hello"
map2 (+) (Left "Hello") (Right 3) == Left "Hello"
map2 (+) (Right 2) (Left "World") == Left "World"
map2 (+) (Right 2) (Right 3) == Right 5It’s essentially a helper for (and why it’s under applicative)
singleton (+) |> andMap (Right 2) |> andMap (Right 3) == Right 5Like map2, but with 3 eithers. Also known as liftA3
Like map2, but with 4 eithers. Also known as liftA4
Returns the length of an Either. This happens to be 0 for a
Left and 1 for a Right.
length (Left 2) == 0
length (Right "Sharks") == 1Folds an Either over a function with an accumulator. If
it is a Left the function is applied with the accumulator.
If it is a Right only the accumulator is returned.
foldl (*) 2 (Left 3) == 6
foldl (*) 2 (Right 3) == 2Folds an Either over a function with an accumulator. If
it is a Right the function is applied with the accumulator.
If it is a Left only the accumulator is returned.
foldr (*) 2 (Left 3) == 2
foldr (*) 2 (Right 3) == 6Chain together in many computations that will stop computing if
a chain is on a Left. Also known as bind.
Left "Hello" |> andThen (\i -> Right (i + 1)) == Left "Hello"
Right 2 |> andThen (\i -> Right (i + 1)) == Right 3Chain together in many computations that will stop computing if
a chain is on a Right. Also known as bind.
Left "Hello" |> andThen (\s -> Left (s ++ "!!")) == Left "Hello!!"
Right 2 |> andThen (\s -> Left (s ++ "!!")) == Right 2Alias for andThen.
Append inner values of a Left.
appendLeft (Left [ 1, 2 ]) (Left [ 3, 4 ]) == Left [ 1, 2, 3, 4 ]
appendLeft (Left [ 1, 2 ]) (Right 'b') == Left [ 1, 2 ]
appendLeft (Right 'a') (Left [ 3, 4 ]) == Left [ 3, 4 ]
appendLeft (Right 'a') (Right 'b') == Right 'a'Append inner values of a Right.
appendRight (Right "Hello") (Right "World") == Right "HelloWorld"
appendRight (Right "Hello") (Left 1) == Right "Hello"
appendRight (Left 0) (Right "World") == Right "World"
appendRight (Left 0) (Left 1) == Left 0One rendition of equals assuming both sides of the Either are comparable.
equals (Right "Hello") (Right "Hello") == True
equals (Right "Hello") (Right "World") == False
equals (Right "Hello") (Left "Hello") == False
equals (Right "Hello") (Left 1) == False
equals (Left 0) (Right "World") == False
equals (Left 0) (Left 0) == True
equals (Left 0) (Left 1) == False
equals (Left 0) (Right 0) == FalseConverts a Either x b to a List of b.
toList (Right 1) == [ 1 ]
toList (Left 'a') == []Folds a Either x b to a List of c via a transforming function.
toList ((+) 1) (Right 1) == [ 2 ]
toList ((+) 1) (Left 'a') == []Converts a List of Either a x to a List of a.
lefts [ Left "Hello", Left "world", Right 2 ] == [ "Hello", "world" ]Converts a List of Either x b to a List of b.
rights [ Left "Hello", Left, "world", Right 2 ] == [ 2 ]Converts a List of Either a b, into a tuple2 where
the first value is a List a and the second is List b.
partition [ Left "Hello", Left "world", Right 2 ] == ( [ "Hello", "World" ], [ 2 ] )Collects the list of elements of a structure, from left to right.
biList (Left 4) == [ 4 ]
biList (Right 9) == [ 9 ]Convert from Either to Array
toArray (Right 1) == Array.fromList [ 1 ]
toArray (Left 'a') == Array.fromList []Folds from Either to Array via a transforming function.
toArrayVia ((+) 1) (Right 1) == Array.fromList [ 2 ]
toArrayVia ((+) 1) (Left 'a') == Array.fromList []Convert from Either to Set
toSet (Right 1) == Set.fromList [ 1 ]
toSet (Left 'a') == Set.fromList []Folds from Either to Set via a transforming function.
toSetVia ((+) 1) (Right 1) == Set.fromList [ 2 ]
toSetVia ((+) 1) (Left 'a') == Set.fromList []Convert from Either to Dict
toDict (Right ( "KEY", 1 )) == Dict.fromList [ ( "KEY", 1 ) ]
toDict (Left 'a') == Dict.fromList []Folds from Either to Dict via a transforming function.
toDictVia (Right ( "KEY", 1 )) == Dict.fromList [ ( "KEY", 1 ) ]
toDictVia (Left 'a') == Dict.fromList []Maybe get the Right side of an Either.
toMaybe (Right 2) == Just 2
toMaybe (Left "World") == NothingFolds a Maybe get the Right side of an Either via a transforming
function.
toMaybeVia ((*) 3) (Right 2) == Just 6
toMaybeVia ((*) 3) (Left "World") == NothingMaybe get the Left side of an Either.
leftToMaybe (Left "World") == Just "World"
leftToMaybe (Right 2) == NothingAlias for toMaybe.
Convert from a Maybe to Either with a default value
for Left for Nothing.
fromMaybe "Hello" (Just 2) == Right 2
fromMaybe "Hello" Nothing == Left "Hello"Convert from a Maybe to Either with a default value
for Right for Nothing.
leftFromMaybe 3 (Just "World") == Left "World"
leftFromMaybe 3 Nothing == Right 3Alias for fromMaybe.
Convert from Either to Result.
toResult (Right 2) == Ok 2
toResult (Left "World") == Err "World"Fold from Either to Result via transforming function.
toResultVia ((+) 3) (Left "World") == Err "World"
toResultVia ((+) 3) (Right 2) == Ok 5Convert from Result to Either.
fromResult (Ok 2) == Right 2
fromResult (Err "World") == Left "World"Convert from Either to Task
toTask (Right "World") -- succeed "World"
toTask (Left 2) -- fail 2Fold from Either to Task via transforming function.
toTaskVia (\s -> s ++ "!!") (Right "World") -- succeed "World!!"
toTaskVia (\s -> s ++ "!!") (Left 2) -- fail 2Returns True if argument is Left _
isLeft (Left "World") == True
isLeft (Right 2) == FalseReturns True if argument is Right _
isRight (Left "World") == False
isRight (Right 2) == TrueExtract left value or a default.
fromLeft "World" (Left "Hello") == "Hello"
fromLeft "World" (Right 2) == "World"Extract right value or a default.
fromRight 3 (Left "Hello") == 3
fromRight 3 (Right 2) == 2Alias for fromRight.
Given a function for both Left and Right to to type a generic
type c, collapse down the Either to a value of that type.
unpack identity toString (Left "World") == "World"
unpack identity toString (Right 2) == "2"Apply a function to Right value. If argument was a Left use the
default value. Equivalent to Either.map >> Either.fromRight.
unwrap 99 ((+) 1) (Left "Hello") == 99
unwrap 99 ((+) 1) (Right 2) == 3
The only implementation