diff options
-rw-r--r-- | src/scala/Eq.scala | 17 | ||||
-rw-r--r-- | tests/neg/equality.scala | 9 |
2 files changed, 21 insertions, 5 deletions
diff --git a/src/scala/Eq.scala b/src/scala/Eq.scala new file mode 100644 index 000000000..697ec4318 --- /dev/null +++ b/src/scala/Eq.scala @@ -0,0 +1,17 @@ +package scala + +/** A marker class indicating that values of kind `T` can be compared. */ +class Eq[-L, -R] + +/** Besides being a companion object, this object + * can also be used as a value that's compatible with + * any instance of `Eq`. + */ +object Eq extends Eq[Any, Any] { + + /** An implicit that provides an `Eq` instance for all types `T` + * such that `T <: EqClass[T]`. + */ + implicit def eqAny[L, R]: Eq[L, R] = Eq +} + diff --git a/tests/neg/equality.scala b/tests/neg/equality.scala index a32db57c5..4a77a2d25 100644 --- a/tests/neg/equality.scala +++ b/tests/neg/equality.scala @@ -10,10 +10,9 @@ object equality { case class Some[+T](x: T) extends Option[T] case object None extends Option[Nothing] - implicit def eqStr: Eq[Str, Str] = Eq() - implicit def eqNum: Eq[Num, Num] = Eq() - implicit def eqOption[T, U, OT <: Option[T], OU <: Option[U]] - (implicit e: Eq[T, U]): Eq[OT, OU] = Eq() + implicit def eqStr: Eq[Str, Str] = Eq + implicit def eqNum: Eq[Num, Num] = Eq + implicit def eqOption[T, U](implicit e: Eq[T, U]): Eq[Option[T], Option[U]] = Eq def main(args: Array[String]): Unit = { Some(Other(3)) == None @@ -44,7 +43,7 @@ object equality { class Fruit - implicit def eqFruit[A <: Fruit, B <: Fruit]: Eq[A, B] = Eq() + implicit def eqFruit: Eq[Fruit, Fruit] = Eq class Apple extends Fruit class Pear extends Fruit |