Overview
Represents a value of one of two possible types (a disjoint union).
An instance of Either is either an instance of Left or Right.
A common use of Either is as an alternative to Option for dealing with possible missing values. In this usage,
None is replaced with a Left which can contain useful information. Right takes the place of Some. Convention
dictates that Left is used for failure and Right is used for success.
For example, you could use Either<string, number> to detect whether a received input is a string or a number.
const parse = (errorMessage: string) => (input: string): Either<string, number> => {
const n = parseInt(input, 10)
return isNaN(n) ? left(errorMessage) : right(n)
}
Either is right-biased, which means that Right is assumed to be the default case to operate on. If it is Left,
operations like map, chain, … return the Left value unchanged:
right(12).map(double) // right(24)
left(23).map(double) // left(23)
Table of contents
- Either (type alias)
- URI (type alias)
- Left (class)
- map (method)
- ap (method)
- ap_ (method)
- chain (method)
- bimap (method)
- alt (method)
- orElse (method)
- extend (method)
- reduce (method)
- fold (method)
- getOrElse (method)
- getOrElseL (method)
- mapLeft (method)
- inspect (method)
- toString (method)
- isLeft (method)
- isRight (method)
- swap (method)
- filterOrElse (method)
- filterOrElseL (method)
refineOrElse(method)refineOrElseL(method)
- Right (class)
- map (method)
- ap (method)
- ap_ (method)
- chain (method)
- bimap (method)
- alt (method)
- orElse (method)
- extend (method)
- reduce (method)
- fold (method)
- getOrElse (method)
- getOrElseL (method)
- mapLeft (method)
- inspect (method)
- toString (method)
- isLeft (method)
- isRight (method)
- swap (method)
- filterOrElse (method)
- filterOrElseL (method)
- refineOrElse (method)
- refineOrElseL (method)
- URI (constant)
- either (constant)
- fromNullable (function)
- fromOption (function)
- fromOptionL (function)
- fromPredicate (function)
fromRefinement(function)- fromValidation (function)
- getApplyMonoid (function)
- getApplySemigroup (function)
- getCompactable (function)
- getFilterable (function)
- getSemigroup (function)
- getSetoid (function)
- getWitherable (function)
- isLeft (function)
- isRight (function)
- left (function)
- right (function)
- toError (function)
tryCatch(function)- tryCatch2v (function)
Either (type alias)
Signature
export type Either<L, A> = Left<L, A> | Right<L, A>
Added in v1.0.0
URI (type alias)
Signature
export type URI = typeof URI
Left (class)
Left side of Either
Signature
export class Left<L, A> {
constructor(readonly value: L) { ... }
...
}
map (method)
The given function is applied if this is a Right
Signature
map<B>(f: (a: A) => B): Either<L, B> { ... }
ap (method)
Signature
ap<B>(fab: Either<L, (a: A) => B>): Either<L, B> { ... }
ap_ (method)
Flipped version of ap
Signature
ap_<B, C>(this: Either<L, (b: B) => C>, fb: Either<L, B>): Either<L, C> { ... }
chain (method)
Binds the given function across Right
Signature
chain<B>(f: (a: A) => Either<L, B>): Either<L, B> { ... }
bimap (method)
Signature
bimap<V, B>(f: (l: L) => V, g: (a: A) => B): Either<V, B> { ... }
alt (method)
Signature
alt(fy: Either<L, A>): Either<L, A> { ... }
orElse (method)
Lazy version of alt
Signature
orElse<M>(fy: (l: L) => Either<M, A>): Either<M, A> { ... }
Example
import { right } from 'fp-ts/lib/Either'
assert.deepStrictEqual(right(1).orElse(() => right(2)), right(1))
Added in v1.6.0
extend (method)
Signature
extend<B>(f: (ea: Either<L, A>) => B): Either<L, B> { ... }
reduce (method)
Signature
reduce<B>(b: B, f: (b: B, a: A) => B): B { ... }
fold (method)
Applies a function to each case in the data structure
Signature
fold<B>(onLeft: (l: L) => B, onRight: (a: A) => B): B { ... }
getOrElse (method)
Returns the value from this Right or the given argument if this is a Left
Signature
getOrElse(a: A): A { ... }
getOrElseL (method)
Returns the value from this Right or the result of given argument if this is a Left
Signature
getOrElseL(f: (l: L) => A): A { ... }
mapLeft (method)
Maps the left side of the disjunction
Signature
mapLeft<M>(f: (l: L) => M): Either<M, A> { ... }
inspect (method)
Signature
inspect(): string { ... }
toString (method)
Signature
toString(): string { ... }
isLeft (method)
Returns true if the either is an instance of Left, false otherwise
Signature
isLeft(): this is Left<L, A> { ... }
isRight (method)
Returns true if the either is an instance of Right, false otherwise
Signature
isRight(): this is Right<L, A> { ... }
swap (method)
Swaps the disjunction values
Signature
swap(): Either<A, L> { ... }
filterOrElse (method)
Returns Right with the existing value of Right if this is a Right and the given predicate p holds for the
right value, returns Left(zero) if this is a Right and the given predicate p does not hold for the right
value, returns Left with the existing value of Left if this is a Left.
Signature
filterOrElse<B extends A>(p: Refinement<A, B>, zero: L): Either<L, B>
filterOrElse(p: Predicate<A>, zero: L): Either<L, A> { ... }
Example
import { right, left } from 'fp-ts/lib/Either'
assert.deepStrictEqual(right(12).filterOrElse(n => n > 10, -1), right(12))
assert.deepStrictEqual(right(7).filterOrElse(n => n > 10, -1), left(-1))
assert.deepStrictEqual(left(12).filterOrElse(n => n > 10, -1), left(12))
Added in v1.3.0
filterOrElseL (method)
Lazy version of filterOrElse
Signature
filterOrElseL<B extends A>(p: Refinement<A, B>, zero: (a: A) => L): Either<L, B>
filterOrElseL(p: Predicate<A>, zero: (a: A) => L): Either<L, A> { ... }
Added in v1.3.0
refineOrElse (method)
Use filterOrElse instead
Signature
refineOrElse<B extends A>(p: Refinement<A, B>, zero: L): Either<L, B> { ... }
Added in v1.6.0
refineOrElseL (method)
Lazy version of refineOrElse
Use filterOrElseL instead
Signature
refineOrElseL<B extends A>(p: Refinement<A, B>, zero: (a: A) => L): Either<L, B> { ... }
Added in v1.6.0
Right (class)
Right side of Either
Signature
export class Right<L, A> {
constructor(readonly value: A) { ... }
...
}
map (method)
Signature
map<B>(f: (a: A) => B): Either<L, B> { ... }
ap (method)
Signature
ap<B>(fab: Either<L, (a: A) => B>): Either<L, B> { ... }
ap_ (method)
Signature
ap_<B, C>(this: Either<L, (b: B) => C>, fb: Either<L, B>): Either<L, C> { ... }
chain (method)
Signature
chain<B>(f: (a: A) => Either<L, B>): Either<L, B> { ... }
bimap (method)
Signature
bimap<V, B>(f: (l: L) => V, g: (a: A) => B): Either<V, B> { ... }
alt (method)
Signature
alt(fy: Either<L, A>): Either<L, A> { ... }
orElse (method)
Signature
orElse<M>(fy: (l: L) => Either<M, A>): Either<M, A> { ... }
extend (method)
Signature
extend<B>(f: (ea: Either<L, A>) => B): Either<L, B> { ... }
reduce (method)
Signature
reduce<B>(b: B, f: (b: B, a: A) => B): B { ... }
fold (method)
Signature
fold<B>(onLeft: (l: L) => B, onRight: (a: A) => B): B { ... }
getOrElse (method)
Signature
getOrElse(a: A): A { ... }
getOrElseL (method)
Signature
getOrElseL(f: (l: L) => A): A { ... }
mapLeft (method)
Signature
mapLeft<M>(f: (l: L) => M): Either<M, A> { ... }
inspect (method)
Signature
inspect(): string { ... }
toString (method)
Signature
toString(): string { ... }
isLeft (method)
Signature
isLeft(): this is Left<L, A> { ... }
isRight (method)
Signature
isRight(): this is Right<L, A> { ... }
swap (method)
Signature
swap(): Either<A, L> { ... }
filterOrElse (method)
Signature
filterOrElse<B extends A>(p: Refinement<A, B>, zero: L): Either<L, B>
filterOrElse(p: Predicate<A>, zero: L): Either<L, A> { ... }
filterOrElseL (method)
Signature
filterOrElseL<B extends A>(p: Refinement<A, B>, zero: (a: A) => L): Either<L, B>
filterOrElseL(p: Predicate<A>, zero: (a: A) => L): Either<L, A> { ... }
refineOrElse (method)
Signature
refineOrElse<B extends A>(p: Refinement<A, B>, zero: L): Either<L, B> { ... }
refineOrElseL (method)
Signature
refineOrElseL<B extends A>(p: Refinement<A, B>, zero: (a: A) => L): Either<L, B> { ... }
URI (constant)
Signature
export const URI = ...
either (constant)
Signature
export const either: Monad2<URI> &
Foldable2v2<URI> &
Traversable2v2<URI> &
Bifunctor2<URI> &
Alt2<URI> &
Extend2<URI> &
ChainRec2<URI> = ...
Added in v1.0.0
fromNullable (function)
Takes a default and a nullable value, if the value is not nully, turn it into a Right, if the value is nully use
the provided default as a Left
Signature
export const fromNullable = <L>(defaultValue: L) => <A>(a: A | null | undefined): Either<L, A> => ...
Added in v1.0.0
fromOption (function)
Takes a default and a Option value, if the value is a Some, turn it into a Right, if the value is a None use
the provided default as a Left
Signature
export const fromOption = <L>(defaultValue: L) => <A>(fa: Option<A>): Either<L, A> => ...
Added in v1.0.0
fromOptionL (function)
Lazy version of fromOption
Signature
export const fromOptionL = <L>(defaultValue: Lazy<L>) => <A>(fa: Option<A>): Either<L, A> => ...
Added in v1.3.0
fromPredicate (function)
Signature
export function fromPredicate<L, A, B extends A>(
predicate: Refinement<A, B>,
onFalse: (a: A) => L
): (a: A) => Either<L, B>
export function fromPredicate<L, A>(predicate: Predicate<A>, onFalse: (a: A) => L): (a: A) => Either<L, A> { ... }
Added in v1.0.0
fromRefinement (function)
Use fromPredicate instead
Signature
export const fromRefinement = <L, A, B extends A>(refinement: Refinement<A, B>, onFalse: (a: A) => L) => (
a: A
): Either<L, B> => ...
Added in v1.6.0
fromValidation (function)
Signature
export const fromValidation = <L, A>(fa: Validation<L, A>): Either<L, A> => ...
Added in v1.0.0
getApplyMonoid (function)
Signature
export const getApplyMonoid = <L, A>(M: Monoid<A>): Monoid<Either<L, A>> => ...
Added in v1.7.0
getApplySemigroup (function)
Apply semigroup
Signature
export const getApplySemigroup = <L, A>(S: Semigroup<A>): Semigroup<Either<L, A>> => ...
Example
import { getApplySemigroup, left, right } from 'fp-ts/lib/Either'
import { semigroupSum } from 'fp-ts/lib/Semigroup'
const S = getApplySemigroup<string, number>(semigroupSum)
assert.deepStrictEqual(S.concat(left('a'), left('b')), left('a'))
assert.deepStrictEqual(S.concat(left('a'), right(2)), left('a'))
assert.deepStrictEqual(S.concat(right(1), left('b')), left('b'))
assert.deepStrictEqual(S.concat(right(1), right(2)), right(3))
Added in v1.7.0
getCompactable (function)
Builds Compactable instance for Either given Monoid for the left side
Signature
export function getCompactable<L>(ML: Monoid<L>): Compactable2C<URI, L> { ... }
Added in v1.7.0
getFilterable (function)
Builds Filterable instance for Either given Monoid for the left side
Signature
export function getFilterable<L>(ML: Monoid<L>): Filterable2C<URI, L> { ... }
Added in v1.7.0
getSemigroup (function)
Semigroup returning the left-most non-Left value. If both operands are Rights then the inner values are
appended using the provided Semigroup
Signature
export const getSemigroup = <L, A>(S: Semigroup<A>): Semigroup<Either<L, A>> => ...
Example
import { getSemigroup, left, right } from 'fp-ts/lib/Either'
import { semigroupSum } from 'fp-ts/lib/Semigroup'
const S = getSemigroup<string, number>(semigroupSum)
assert.deepStrictEqual(S.concat(left('a'), left('b')), left('a'))
assert.deepStrictEqual(S.concat(left('a'), right(2)), right(2))
assert.deepStrictEqual(S.concat(right(1), left('b')), right(1))
assert.deepStrictEqual(S.concat(right(1), right(2)), right(3))
Added in v1.7.0
getSetoid (function)
Signature
export const getSetoid = <L, A>(SL: Setoid<L>, SA: Setoid<A>): Setoid<Either<L, A>> => ...
Added in v1.0.0
getWitherable (function)
Builds Witherable instance for Either given Monoid for the left side
Signature
export function getWitherable<L>(ML: Monoid<L>): Witherable2C<URI, L> { ... }
Added in v1.7.0
isLeft (function)
Returns true if the either is an instance of Left, false otherwise
Signature
export const isLeft = <L, A>(fa: Either<L, A>): fa is Left<L, A> => ...
Added in v1.0.0
isRight (function)
Returns true if the either is an instance of Right, false otherwise
Signature
export const isRight = <L, A>(fa: Either<L, A>): fa is Right<L, A> => ...
Added in v1.0.0
left (function)
Constructs a new Either holding a Left value. This usually represents a failure, due to the right-bias of this
structure
Signature
export const left = <L, A>(l: L): Either<L, A> => ...
Added in v1.0.0
right (function)
Constructs a new Either holding a Right value. This usually represents a successful value due to the right bias
of this structure
Signature
export const right = <L, A>(a: A): Either<L, A> => ...
Added in v1.0.0
toError (function)
Default value for the optional onerror argument of tryCatch
Signature
export const toError = (e: unknown): Error => ...
Added in v1.0.0
tryCatch (function)
Use tryCatch2v instead
Signature
export const tryCatch = <A>(f: Lazy<A>, onerror: (e: unknown) => Error = toError): Either<Error, A> => ...
Added in v1.0.0
tryCatch2v (function)
Constructs a new Either from a function that might throw
Signature
export const tryCatch2v = <L, A>(f: Lazy<A>, onerror: (e: unknown) => L): Either<L, A> => ...
Example
import { Either, left, right, tryCatch2v } from 'fp-ts/lib/Either'
const unsafeHead = <A>(as: Array<A>): A => {
if (as.length > 0) {
return as[0]
} else {
throw new Error('empty array')
}
}
const head = <A>(as: Array<A>): Either<Error, A> => {
return tryCatch2v(() => unsafeHead(as), e => (e instanceof Error ? e : new Error('unknown error')))
}
assert.deepStrictEqual(head([]), left(new Error('empty array')))
assert.deepStrictEqual(head([1, 2, 3]), right(1))
Added in v1.11.0