Trait

org.scalactic.Or

BAD

Related Doc: package Or

Permalink

trait BAD[B] extends AnyRef

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.

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

Type Members

  1. type GOOD[G] = Or[G, B]

    Permalink

    Type member that provides a curried alias to G Or B.

    Type member that provides a curried alias to G Or B.

    See the main documentation for trait BAD for more detail.

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. final def getClass(): Class[_]

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

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

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

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

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

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

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

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

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

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

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

Inherited from AnyRef

Inherited from Any

Ungrouped