Object/Class

org.scalactic

Or

Related Docs: class Or | package scalactic

Permalink

object Or

The companion object for Or providing factory methods for creating Ors from Eithers and Trys.

Source
Or.scala
Linear Supertypes
AnyRef, Any
Ordering
  1. Alphabetic
  2. By inheritance
Inherited
  1. Or
  2. AnyRef
  3. Any
  1. Hide All
  2. Show all
Visibility
  1. Public
  2. All

Type Members

  1. trait BAD[B] extends AnyRef

    Permalink

    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.

  2. trait GOOD[G] extends AnyRef

    Permalink

    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.

Value Members

  1. final def !=(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int

    Permalink
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  4. final def asInstanceOf[T0]: T0

    Permalink
    Definition Classes
    Any
  5. def clone(): AnyRef

    Permalink
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  6. final def eq(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  7. def equals(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  8. def finalize(): Unit

    Permalink
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  9. def from[G, B](option: Option[G], orElse: ⇒ B): Or[G, B]

    Permalink

    Constructs a new Or from the given Option.

    Constructs a new Or from the given Option.

    option

    the Option to convert to an Or

    orElse

    the Bad value to use if the Option passed as option is None.

    returns

    a new Or whose Good type is the Option's type and whose Bad type is the type of the passed orElse parameter.

  10. def from[B, G](either: Either[B, G]): Or[G, B]

    Permalink

    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.

    either

    the Either to convert to an Or

    returns

    a new Or whose Good type is the Either's Right type and whose Bad type is Either's Left type.

  11. def from[G](theTry: Try[G]): Or[G, Throwable]

    Permalink

    Constructs a new Or from the given Try.

    Constructs a new Or from the given Try.

    theTry

    the Try to convert to an Or

    returns

    a new Or whose Good type is the Try's Success type and whose Bad type is Throwable.

  12. final def getClass(): Class[_]

    Permalink
    Definition Classes
    AnyRef → Any
  13. def hashCode(): Int

    Permalink
    Definition Classes
    AnyRef → Any
  14. final def isInstanceOf[T0]: Boolean

    Permalink
    Definition Classes
    Any
  15. final def ne(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  16. final def notify(): Unit

    Permalink
    Definition Classes
    AnyRef
  17. final def notifyAll(): Unit

    Permalink
    Definition Classes
    AnyRef
  18. final def synchronized[T0](arg0: ⇒ T0): T0

    Permalink
    Definition Classes
    AnyRef
  19. def toString(): String

    Permalink
    Definition Classes
    AnyRef → Any
  20. final def wait(): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  21. final def wait(arg0: Long, arg1: Int): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  22. final def wait(arg0: Long): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )

Inherited from AnyRef

Inherited from Any

Ungrouped