Skip to content

Commit e766998

Browse files
barambaniLukaJCB
authored andcommitted
Issue 2891 - Ambiguous Vector instances (#3100)
* Changed precedence of kernel instances for Vector * Fixed also List and Queue
1 parent 1f81050 commit e766998

File tree

6 files changed

+52
-12
lines changed

6 files changed

+52
-12
lines changed

kernel/src/main/scala/cats/kernel/instances/ListInstances.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@ trait ListInstances extends ListInstances1 {
1313
}
1414

1515
private[instances] trait ListInstances1 extends ListInstances2 {
16-
implicit def catsKernelStdPartialOrderForList[A: PartialOrder]: PartialOrder[List[A]] =
17-
new ListPartialOrder[A]
18-
1916
implicit def catsKernelStdHashForList[A: Hash]: Hash[List[A]] =
2017
new ListHash[A]
2118
}
2219

23-
private[instances] trait ListInstances2 {
20+
private[instances] trait ListInstances2 extends ListInstances3 {
21+
implicit def catsKernelStdPartialOrderForList[A: PartialOrder]: PartialOrder[List[A]] =
22+
new ListPartialOrder[A]
23+
}
24+
25+
private[instances] trait ListInstances3 {
2426
implicit def catsKernelStdEqForList[A: Eq]: Eq[List[A]] =
2527
new ListEq[A]
2628
}

kernel/src/main/scala/cats/kernel/instances/QueueInstances.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@ trait QueueInstances extends QueueInstances1 {
1313
}
1414

1515
private[instances] trait QueueInstances1 extends QueueInstances2 {
16-
implicit def catsKernelStdPartialOrderForQueue[A: PartialOrder]: PartialOrder[Queue[A]] =
17-
new QueuePartialOrder[A]
18-
1916
implicit def catsKernelStdHashForQueue[A: Hash]: Hash[Queue[A]] =
2017
new QueueHash[A]
2118
}
2219

23-
private[instances] trait QueueInstances2 {
20+
private[instances] trait QueueInstances2 extends QueueInstances3 {
21+
implicit def catsKernelStdPartialOrderForQueue[A: PartialOrder]: PartialOrder[Queue[A]] =
22+
new QueuePartialOrder[A]
23+
}
24+
25+
private[instances] trait QueueInstances3 {
2426
implicit def catsKernelStdEqForQueue[A: Eq]: Eq[Queue[A]] =
2527
new QueueEq[A]
2628
}

kernel/src/main/scala/cats/kernel/instances/VectorInstances.scala

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,22 @@ import compat.scalaVersionSpecific._
66
trait VectorInstances extends VectorInstances1 {
77
implicit def catsKernelStdOrderForVector[A: Order]: Order[Vector[A]] =
88
new VectorOrder[A]
9+
910
implicit def catsKernelStdMonoidForVector[A]: Monoid[Vector[A]] =
1011
new VectorMonoid[A]
1112
}
1213

1314
private[instances] trait VectorInstances1 extends VectorInstances2 {
14-
implicit def catsKernelStdPartialOrderForVector[A: PartialOrder]: PartialOrder[Vector[A]] =
15-
new VectorPartialOrder[A]
16-
1715
implicit def catsKernelStdHashForVector[A: Hash]: Hash[Vector[A]] =
1816
new VectorHash[A]
1917
}
2018

21-
private[instances] trait VectorInstances2 {
19+
private[instances] trait VectorInstances2 extends VectorInstances3 {
20+
implicit def catsKernelStdPartialOrderForVector[A: PartialOrder]: PartialOrder[Vector[A]] =
21+
new VectorPartialOrder[A]
22+
}
23+
24+
private[instances] trait VectorInstances3 {
2225
implicit def catsKernelStdEqForVector[A: Eq]: Eq[Vector[A]] =
2326
new VectorEq[A]
2427
}

tests/src/test/scala/cats/tests/ListSuite.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,17 @@ class ListSuite extends CatsSuite {
6060
l.show should ===(l.toString)
6161
}
6262
}
63+
64+
test("the instance for `Eq[List[A]]` is not ambiguous when A has a Hash and a PartialOrder") {
65+
66+
import cats.kernel.{Hash, PartialOrder}
67+
68+
trait A
69+
implicit def po: PartialOrder[A] = ???
70+
implicit def ho: Hash[A] = ???
71+
72+
lazy val _ = implicitly[Eq[List[A]]]
73+
}
6374
}
6475

6576
final class ListInstancesSuite extends AnyFunSuiteLike {

tests/src/test/scala/cats/tests/QueueSuite.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,15 @@ class QueueSuite extends CatsSuite {
3232
Queue(1, 2, 3).show should ===("Queue(1, 2, 3)")
3333
Queue.empty[Int].show should ===("Queue()")
3434
}
35+
36+
test("the instance for `Eq[Queue[A]]` is not ambiguous when A has a Hash and a PartialOrder") {
37+
38+
import cats.kernel.{Hash, PartialOrder}
39+
40+
trait A
41+
implicit def po: PartialOrder[A] = ???
42+
implicit def ho: Hash[A] = ???
43+
44+
lazy val _ = implicitly[Eq[Queue[A]]]
45+
}
3546
}

tests/src/test/scala/cats/tests/VectorSuite.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,17 @@ class VectorSuite extends CatsSuite {
5555
test("toNev on empty vector returns None") {
5656
assert(Vector.empty[Int].toNev == None)
5757
}
58+
59+
test("the instance for `Eq[Vector[A]]` is not ambiguous when A has a Hash and a PartialOrder") {
60+
61+
import cats.kernel.{Hash, PartialOrder}
62+
63+
trait A
64+
implicit def po: PartialOrder[A] = ???
65+
implicit def ho: Hash[A] = ???
66+
67+
lazy val _ = implicitly[Eq[Vector[A]]]
68+
}
5869
}
5970

6071
final class VectorInstancesSuite extends AnyFunSuiteLike {

0 commit comments

Comments
 (0)