org.scalactic.Or

GOOD

trait GOOD[G] extends AnyRef

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.

Source
Or.scala
Linear Supertypes
AnyRef, Any
Ordering
  1. Alphabetic
  2. By inheritance
Inherited
  1. GOOD
  2. AnyRef
  3. Any
  1. Hide All
  2. Show all
Learn more about member selection
Visibility
  1. Public
  2. All

Type Members

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

    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 GOOD for more detail.

Value Members

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

    Definition Classes
    AnyRef
  2. final def !=(arg0: Any): Boolean

    Definition Classes
    Any
  3. final def ##(): Int

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

    Definition Classes
    AnyRef
  5. final def ==(arg0: Any): Boolean

    Definition Classes
    Any
  6. final def asInstanceOf[T0]: T0

    Definition Classes
    Any
  7. def clone(): AnyRef

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

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

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

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  11. final def getClass(): Class[_]

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

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

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

    Definition Classes
    AnyRef
  15. final def notify(): Unit

    Definition Classes
    AnyRef
  16. final def notifyAll(): Unit

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

    Definition Classes
    AnyRef
  18. def toString(): String

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

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

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

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )

Inherited from AnyRef

Inherited from Any

Ungrouped