Trait providing a concise type lambda syntax for Or
types partially applied on their "bad" type.
Trait providing a concise type lambda syntax for Or
types partially applied on their "bad" type.
This trait is used to curry the type parameters of Or
, which takes two type parameters,
into a type (this trait) which takes one parameter, and another (its type member) which
takes the other. For example, type Or[G, B]
(which can be written in infix form
as G Or B
) can be expressed in curried form as Or.BAD[B]#GOOD[G]
.
Leaving off the final G
type parameter yields a "type lambda," such as Or.BAD[ErrorMessage]#GOOD
.
For example, consider this method that takes two type parameters, a type constructor named Context
and a
type named A
:
scala> def example[Context[_], A](ca: Context[A]) = ca example: [Context[_], A](ca: Context[A])Context[A]
Because List
takes a single type parameter, it fits the shape of Context
,
it can be simply passed to example
--i.e., the compiler will infer Context
as List
:
scala> example(List(1, 2, 3)) res0: List[Int] = List(1, 2, 3)
But because Or
takes two type parameters, G
for the "good" type and B
for the "bad" type, it
cannot simply be passed, because the compiler doesn't know which of G
or B you'd want to abstract over:
scala> example(Good(3)) <console>:26: error: no type parameters for method example: (ca: Context[A])Context[A] exist so that it can be applied to arguments (org.scalactic.Good[Int,Nothing]) --- because --- argument expression's type is not compatible with formal parameter type; found : org.scalactic.Good[Int,Nothing] required: ?Context[?A] example(Good(3)) ^ <console>:26: error: type mismatch; found : org.scalactic.Good[Int,Nothing] required: Context[A] example(Good(3)) ^
You must therefore tell the compiler which one you want with a "type lambda." Here's an example:
scala> example[({type L[G] = G Or String})#L, Int](Good(3)) res1: org.scalactic.Or[Int,String] = Good(3)
The alternate type lambda syntax provided by this trait is more concise and hopefully easier to remember and read:
scala> example[Or.BAD[String]#GOOD, Int](Good(3)) res2: org.scalactic.Or[Int,String] = Good(3)
You can read Or.BAD[String]#GOOD
as: an Or
with its "bad" type
fixed to String
and its "good" type left unspecified.
Trait providing a concise type lambda syntax for Or
types partially applied on their "good" type.
Trait providing a concise type lambda syntax for Or
types partially applied on their "good" type.
This trait is used to curry the type parameters of Or
, which takes two type parameters,
into a type (this trait) which takes one parameter, and another (its type member) which
takes the other. For example, type Or[G, B]
(which can be written in infix form
as G Or B
) can be expressed in curried form as Or.GOOD[G]#BAD[B]
.
Leaving off the final BAD
type parameter yields a "type lambda," such as Or.GOOD[Int]#BAD
.
For example, consider this method that takes two type parameters, a type constructor named Context
and a
type named A
:
scala> def example[Context[_], A](ca: Context[A]) = ca example: [Context[_], A](ca: Context[A])Context[A]
Because List
takes a single type parameter, it fits the shape of Context
,
it can be simply passed to example
--i.e., the compiler will infer Context
as List
:
scala> example(List(1, 2, 3)) res0: List[Int] = List(1, 2, 3)
But because Or
takes two type parameters, G
for the "good" type and B
for the "bad" type, it
cannot simply be passed, because the compiler doesn't know which of G
or B you'd want to abstract over:
scala> example(Good(3)) <console>:26: error: no type parameters for method example: (ca: Context[A])Context[A] exist so that it can be applied to arguments (org.scalactic.Good[Int,Nothing]) --- because --- argument expression's type is not compatible with formal parameter type; found : org.scalactic.Good[Int,Nothing] required: ?Context[?A] example(Good(3)) ^ <console>:26: error: type mismatch; found : org.scalactic.Good[Int,Nothing] required: Context[A] example(Good(3)) ^
You must therefore tell the compiler which one you want with a "type lambda." Here's an example:
scala> example[({type L[B] = Int Or B})#L, String](Good(3)) res1: org.scalactic.Or[Int,String] = Good(3)
The alternate type lambda syntax provided by this trait is more concise and hopefully easier to remember and read:
scala> example[Or.GOOD[Int]#BAD, String](Good(3)) res15: org.scalactic.Or[Int,String] = Good(3)
You can read Or.GOOD[Int]#BAD
as: an Or
with its "good" type
fixed to Int
and its "bad" type left unspecified.
Constructs a new Or
from the given Option
.
Constructs a new Or
from the given Option
.
the Option
to convert to an Or
the Bad
value to use if the Option
passed as option
is None
.
a new Or
whose Good
type is the Option
's type and whose
Bad
type is the type of the passed orElse
parameter.
Constructs a new Or
from the given Either
.
Constructs a new Or
from the given Either
.
Note that values effectively “switch sides” when converting an Either
to an Or
. If the type of the
Either
which you pass to Or.from
is Either[ErrorMessage, Int]
for example, the result will be an
Or[Int, ErrorMessage]
. The reason is that the convention for Either
is that Left
is used for “bad”
values and Right
is used for “good” ones. If you with to keep the types on the same side, invoke swap
on the
Either
before passing it to from
.
the Either
to convert to an Or
a new Or
whose Good
type is the Either
's Right
type and whose
Bad
type is Either
's Left
type.
Constructs a new Or
from the given Try
.
Constructs a new Or
from the given Try
.
the Try
to convert to an Or
a new Or
whose Good
type is the Try
's Success
type and whose
Bad
type is Throwable
.
The companion object for
Or
providing factory methods for creatingOr
s fromEither
s andTry
s.