sealed abstract class \/[+A, +B] extends Product with Serializable
Represents a disjunction: a result that is either an A
or a B
.
An instance of A
\/ B is either a -\/[A]
(aka a "left") or a \/-[B]
(aka a "right").
A common use of a disjunction is to explicitly represent the possibility of failure in a result as opposed to
throwing an exception. By convention, the left is used for errors and the right is reserved for successes.
For example, a function that attempts to parse an integer from a string may have a return type of
NumberFormatException
\/ Int
. However, since there is no need to actually throw an exception, the type (A
)
chosen for the "left" could be any type representing an error and has no need to actually extend Exception
.
A
\/ B
is isomorphic to scala.Either[A, B]
, but \/ is right-biased for all Scala versions, so methods
such as map
and flatMap
apply only in the context of the "right" case. This right bias makes \/ more
convenient to use than scala.Either
in a monadic context in Scala versions <2.12. Methods such as swap
,
swapped
, and leftMap
provide functionality that scala.Either
exposes through left projections.
A
\/ B
is also isomorphic to Validation[A, B]
. The subtle but important difference is that Applicative
instances for Validation accumulates errors ("lefts") while Applicative instances for \/ fail fast on the
first "left" they evaluate. This fail-fast behavior allows \/ to have lawful Monad instances that are consistent
with their Applicative instances, while Validation cannot.
- Source
- Either.scala
- Alphabetic
- By Inheritance
- \/
- Serializable
- Serializable
- Product
- Equals
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Type Members
- final class SwitchingDisjunction [X] extends AnyRef
Abstract Value Members
Concrete Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
def
+++[AA >: A, BB >: B](x: ⇒ \/[AA, BB])(implicit M1: Semigroup[BB], M2: Semigroup[AA]): \/[AA, BB]
Sums up values inside disjunction, if both are left or right.
Sums up values inside disjunction, if both are left or right. Returns first left otherwise.
\/-(v1) +++ \/-(v2) → \/-(v1 + v2) \/-(v1) +++ -\/(v2) → -\/(v2) -\/(v1) +++ \/-(v2) → -\/(v1) -\/(v1) +++ -\/(v2) → -\/(v1 + v2)
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
===[AA >: A, BB >: B](x: \/[AA, BB])(implicit EA: Equal[AA], EB: Equal[BB]): Boolean
Compare two disjunction values for equality.
-
def
@\?/[AA, BB](k: (Validation[A, B]) ⇒ Validation[AA, BB]): \/[AA, BB]
Run a validation function and back to disjunction again.
Run a validation function and back to disjunction again. Alias for
validationed
-
def
ap[AA >: A, C](f: ⇒ \/[AA, (B) ⇒ C]): \/[AA, C]
Apply a function in the environment of the right of this disjunction.
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
bimap[C, D](f: (A) ⇒ C, g: (B) ⇒ D): \/[C, D]
Binary functor map on this disjunction.
-
def
bitraverse[F[_], C, D](f: (A) ⇒ F[C], g: (B) ⇒ F[D])(implicit arg0: Functor[F]): F[\/[C, D]]
Binary functor traverse on this disjunction.
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
def
compare[AA >: A, BB >: B](x: \/[AA, BB])(implicit EA: Order[AA], EB: Order[BB]): Ordering
Compare two disjunction values for ordering.
-
def
ensure[AA >: A](onLeft: ⇒ AA)(f: (B) ⇒ Boolean): \/[AA, B]
Ensures that the right value of this disjunction satisfies the given predicate, or returns left with the given value.
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
exists[BB >: B](p: (BB) ⇒ Boolean): Boolean
Return
true
if this disjunction is a right value satisfying the given predicate. -
def
filter[AA >: A](p: (B) ⇒ Boolean)(implicit M: Monoid[AA]): \/[AA, B]
Filter on the right of this disjunction.
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
def
flatMap[AA >: A, D](g: (B) ⇒ \/[AA, D]): \/[AA, D]
Bind through the right of this disjunction.
-
def
fold[X](l: (A) ⇒ X, r: (B) ⇒ X): X
Catamorphism.
Catamorphism. Run the first given function if left, otherwise, the second given function.
-
def
foldConst[X](l: ⇒ X, r: ⇒ X): X
Evaluate
l
and return if left, otherwise,r
. -
def
foldRight[Z](z: ⇒ Z)(f: (B, ⇒ Z) ⇒ Z): Z
Fold on the right of this disjunction.
-
def
forall[BB >: B](p: (BB) ⇒ Boolean): Boolean
Return
true
if this disjunction is a left value or the right value satisfies the given predicate. -
def
foreach(g: (B) ⇒ Unit): Unit
Run the side-effect on the right of this disjunction.
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
-
def
getOrElse[BB >: B](x: ⇒ BB): BB
Return the right value of this disjunction or the given default if left.
Return the right value of this disjunction or the given default if left. Alias for
|
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
def
isLeft: Boolean
Return
true
if this disjunction is left. -
def
isRight: Boolean
Return
true
if this disjunction is right. -
def
leftMap[C](f: (A) ⇒ C): \/[C, B]
Run the given function on the left value.
-
def
loopl[AA >: A, BB >: B, X](left: (AA) ⇒ \/[X, \/[AA, BB]], right: (BB) ⇒ X): X
Spin in tail-position on the left value of this disjunction.
-
def
loopr[AA >: A, BB >: B, X](left: (AA) ⇒ X, right: (BB) ⇒ \/[X, \/[AA, BB]]): X
Spin in tail-position on the right value of this disjunction.
-
def
map[D](g: (B) ⇒ D): \/[A, D]
Map on the right of this disjunction.
-
def
merge[AA >: A](implicit ev: <~<[B, AA]): AA
Return the value from whichever side of the disjunction is defined, given a commonly assignable type.
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
-
def
orElse[C, BB >: B](x: ⇒ \/[C, BB]): \/[C, BB]
Return this if it is a right, otherwise, return the given value.
Return this if it is a right, otherwise, return the given value. Alias for
|||
-
def
productIterator: Iterator[Any]
- Definition Classes
- Product
-
def
productPrefix: String
- Definition Classes
- Product
-
def
recover[BB >: B](pf: PartialFunction[A, BB]): \/[A, BB]
Run the given function on the left and return right with the result.
-
def
recoverWith[AA >: A, BB >: B](pf: PartialFunction[AA, \/[AA, BB]]): \/[AA, BB]
Run the given function on the left and return the result.
-
def
show[AA >: A, BB >: B](implicit SA: Show[AA], SB: Show[BB]): Cord
Show for a disjunction value.
-
def
swap: \/[B, A]
Flip the left/right values in this disjunction.
Flip the left/right values in this disjunction. Alias for
unary_~
-
def
swapped[AA, BB](k: (\/[B, A]) ⇒ \/[BB, AA]): \/[AA, BB]
Run the given function on this swapped value.
Run the given function on this swapped value. Alias for
~
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toEither: Either[A, B]
Convert to a core
scala.Either
at your own peril. -
def
toList: List[B]
Return an empty list or list with one element on the right of this disjunction.
-
def
toMaybe[BB >: B]: Maybe[BB]
Return an empty maybe or option with one element on the right of this disjunction.
Return an empty maybe or option with one element on the right of this disjunction. Useful to sweep errors under the carpet.
-
def
toOption: Option[B]
Return an empty option or option with one element on the right of this disjunction.
Return an empty option or option with one element on the right of this disjunction. Useful to sweep errors under the carpet.
-
def
toStream: Stream[B]
Return an empty stream or stream with one element on the right of this disjunction.
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
def
toThese: \&/[A, B]
Convert to a These.
-
def
traverse[F[_], AA >: A, D](g: (B) ⇒ F[D])(implicit arg0: Applicative[F]): F[\/[AA, D]]
Traverse on the right of this disjunction.
-
def
unary_~: \/[B, A]
Flip the left/right values in this disjunction.
Flip the left/right values in this disjunction. Alias for
swap
-
def
validation: Validation[A, B]
Convert to a Validation.
-
def
validationNel[AA >: A]: ValidationNel[AA, B]
Convert to a ValidationNel.
-
def
validationed[AA, BB](k: (Validation[A, B]) ⇒ Validation[AA, BB]): \/[AA, BB]
Run a validation function and back to disjunction again.
Run a validation function and back to disjunction again. Alias for
@\?/
-
def
valueOr[BB >: B](x: (A) ⇒ BB): BB
Return the right value of this disjunction or run the given function on the left.
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
def
|[BB >: B](x: ⇒ BB): BB
Return the right value of this disjunction or the given default if left.
Return the right value of this disjunction or the given default if left. Alias for
getOrElse
-
def
|||[C, BB >: B](x: ⇒ \/[C, BB]): \/[C, BB]
Return this if it is a right, otherwise, return the given value.
Return this if it is a right, otherwise, return the given value. Alias for
orElse
-
def
~[AA, BB](k: (\/[B, A]) ⇒ \/[BB, AA]): \/[AA, BB]
Run the given function on this swapped value.
Run the given function on this swapped value. Alias for
swapped
Deprecated Value Members
-
def
:?>>[X](right: ⇒ X): SwitchingDisjunction[X]
If this disjunction is right, return the given X value, otherwise, return the X value given to the return value.
If this disjunction is right, return the given X value, otherwise, return the X value given to the return value.
- Annotations
- @deprecated
- Deprecated
(Since version 7.3.0) Due to SI-1980, <<?: will always evaluate its left argument; use foldConst instead