Skip to content

Commit c64ee4b

Browse files
committed
Make Eq a derivable typeclass
1 parent d78ba4a commit c64ee4b

File tree

4 files changed

+56
-3
lines changed

4 files changed

+56
-3
lines changed

library/src/scala/Eq.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ sealed trait Eq[-L, -R]
1212
* any instance of `Eq`.
1313
*/
1414
object Eq extends Eq[Any, Any] {
15+
def derived: Eq[Any, Any] = Eq
1516

1617
/** A fall-back "implicit" to compare values of any types.
1718
* Even though this method is not declared implicit, the compiler will

tests/neg/derive-eq.scala

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
case class One() derives Eq
3+
case class Two() derives Eq
4+
5+
implied for Eq[One, Two] = Eq
6+
7+
enum Lst[T] derives Eq {
8+
case Cons(x: T, xs: Lst[T])
9+
case Nil()
10+
}
11+
12+
case class Triple[S, T, U] derives Eq
13+
14+
15+
object Test extends App {
16+
Test1
17+
implicitly[Eq[Lst[Lst[One]], Lst[Lst[Two]]]]
18+
implicitly[Eq[Triple[One, One, One],
19+
Triple[Two, Two, Two]]]
20+
21+
val x: Triple[List[One], One, Two] = ???
22+
val y: Triple[List[Two], One, Two] = ???
23+
val z: Triple[One, List[Two], One] = ???
24+
x == y // OK
25+
x == x // OK
26+
y == y // OK
27+
28+
y == x // error
29+
x == z // error
30+
z == y // error
31+
}

tests/neg/equality.scala

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ object equality {
6464
1 == null // OK by eqIntNum
6565

6666

67-
class Fruit
68-
69-
implicit def eqFruit: Eq[Fruit, Fruit] = Eq
67+
class Fruit derives Eq
7068

7169
class Apple extends Fruit
7270
class Pear extends Fruit

tests/run/derive-eq.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
case class One() derives Eq
3+
case class Two() derives Eq
4+
5+
implied for Eq[One, Two] = Eq
6+
7+
enum Lst[T] derives Eq {
8+
case Cons(x: T, xs: Lst[T])
9+
case Nil()
10+
}
11+
12+
class Triple[S, T, U] derives Eq
13+
14+
15+
object Test extends App {
16+
implicitly[Eq[Lst[Lst[One]], Lst[Lst[Two]]]]
17+
implicitly[Eq[Triple[One, One, One],
18+
Triple[Two, Two, Two]]]
19+
20+
val x: Triple[List[One], One, Two] = ???
21+
val y: Triple[List[Two], One, Two] = ???
22+
assert(x == y)
23+
}

0 commit comments

Comments
 (0)