final case class X(val i: Int)
object X {
implicit final class XOps[F[_]](xs: F[X]) {
def unpack(implicit ev: F[X] <:< Iterable[X]): Iterable[Int] = xs.map(_.i)
}
}
object App extends App {
// good
val ys: List[X] = List(X(1))
println(ys.unpack)
// bad
def printPolymorphic[F[_]](xs: F[X])(implicit ev: F[X] <:< Iterable[X]) = {
locally {
// implicit XOps is correct
import X.XOps
println(xs.unpack) // found
}
// but it's not being searched for in the companion object of X
println(xs.unpack) // error: unpack is not a member of F[X]
}
printPolymorphic[List](ys)
}
Output
value unpack is not a member of F[X]
where: F is a type in method printPolymorphic with bounds <: [_] =>> Any
Expectation
Expected to work correctly, as in Scala 2. When xs has a concrete type constructor List in List[X], the extension method is correctly searched in the companion of X. However, the X companion is incorrectly omitted from search when xs has an abstract type parameter type constructor F in F[X].
Compiler version
3.5.2, 3.3.4
Minimized code
Scala 3 Scastie (error): https://scastie.scala-lang.org/yl3UgZcSSKmowV8owgjtzg Scala 2 Scastie (works correctly): https://scastie.scala-lang.org/cPFPUhfCQ4ONHzBIKawgbg
Output
Expectation
Expected to work correctly, as in Scala 2. When
xs
has a concrete type constructorList
inList[X]
, the extension method is correctly searched in the companion ofX
. However, theX
companion is incorrectly omitted from search whenxs
has an abstract type parameter type constructorF
inF[X]
.