-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Description
Minimized code
This is a version of the test tests/run/poly-kinded-derives.scala where all type parameters are made explicit. The critical change is in the the line marked // <<<<
import scala.deriving._
object Test extends App {
{
trait Show[T]
object Show {
given Show[Int] {}
given [T](using st: Show[T]) as Show[Tuple1[T]]
given t2[T, U](using st: Show[T], su: Show[U]) as Show[(T, U)]
given t3 [T, U, V](using st: Show[T], su: Show[U], sv: Show[V]) as Show[(T, U, V)]
def derived[T](using m: Mirror.Of[T], r: Show[m.MirroredElemTypes]): Show[T] = new Show[T] {}
}
case class Mono(i: Int) derives Show
case class Poly[A](a: A) derives Show
//case class Poly11[F[_]](fi: F[Int]) derives Show
case class Poly2[A, B](a: A, b: B) derives Show
case class Poly3[A, B, C](a: A, b: B, c: C) derives Show
}
{
trait Functor[F[_]]
object Functor {
given [C] as Functor[[T] =>> C] {}
given Functor[[T] =>> Tuple1[T]] {}
given t2 [T] as Functor[[U] =>> (T, U)] {}
given t3 [T, U] as Functor[[V] =>> (T, U, V)] {}
def derived[F[_]](using m: Mirror { type MirroredType[X] = F[X] ; type MirroredElemTypes[_] }, r: Functor[m.MirroredElemTypes]): Functor[F] = new Functor[F] {}
}
case class Mono(i: Int) derives Functor
case class Poly[A](a: A) derives Functor
//case class Poly11[F[_]](fi: F[Int]) derives Functor
case class Poly2[A, B](a: A, b: B) derives Functor
case class Poly3[A, B, C](a: A, b: B, c: C) derives Functor
}
{
trait FunctorK[F[_[_]]]
object FunctorK {
given [C] as FunctorK[[F[_]] =>> C] {}
given [T] as FunctorK[[F[_]] =>> Tuple1[F[T]]]
def derived[F[_[_]]](using m: Mirror { type MirroredType[X[_]] = F[X] ; type MirroredElemTypes[_[_]] }, r: FunctorK[m.MirroredElemTypes]): FunctorK[F] = new FunctorK[F] {} // <<<<
}
case class Mono(i: Int) derives FunctorK
//case class Poly[A](a: A) derives FunctorK
case class Poly11[F[_]](fi: F[Int]) derives FunctorK
//case class Poly2[A, B](a: A, b: B) derives FunctorK
//case class Poly3[A, B, C](a: A, b: B, c: C) derives FunctorK
}
{
trait Bifunctor[F[_, _]]
object Bifunctor {
given [C] as Bifunctor[[T, U] =>> C] {}
given Bifunctor[[T, U] =>> Tuple1[U]] {}
given t2 as Bifunctor[[T, U] =>> (T, U)] {}
given t3 [T] as Bifunctor[[U, V] =>> (T, U, V)] {}
def derived[F[_, _]](using m: Mirror { type MirroredType[X, Y] = F[X, Y] ; type MirroredElemTypes[_, _] }, r: Bifunctor[m.MirroredElemTypes]): Bifunctor[F] = ???
}
case class Mono(i: Int) derives Bifunctor
case class Poly[A](a: A) derives Bifunctor
//case class Poly11[F[_]](fi: F[Int]) derives Bifunctor
case class Poly2[A, B](a: A, b: B) derives Bifunctor
case class Poly3[A, B, C](a: A, b: B, c: C) derives Bifunctor
}
}
Output
We get a crash in productMirror:
exception occurred while typechecking ../run/poly-kinded-derives.scala
exception occurred while compiling ../run/poly-kinded-derives.scala
java.lang.AssertionError: assertion failed: invalid prefix HKTypeLambda(List(X), List(TypeBounds(TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Nothing),TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Any))), AppliedType(TypeVar(TypeParamRef(F)),List(TypeParamRef(X)))) while compiling ../run/poly-kinded-derives.scala
Exception in thread "main" java.lang.AssertionError: assertion failed: invalid prefix HKTypeLambda(List(X), List(TypeBounds(TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Nothing),TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Any))), AppliedType(TypeVar(TypeParamRef(F)),List(TypeParamRef(X))))
at dotty.DottyPredef$.assertFail(DottyPredef.scala:17)
at dotty.tools.dotc.core.Types$NamedType.<init>(Types.scala:1870)
at dotty.tools.dotc.core.Types$TypeRef.<init>(Types.scala:2426)
at dotty.tools.dotc.core.Types$CachedTypeRef.<init>(Types.scala:2482)
at dotty.tools.dotc.core.Uniques$NamedTypeUniques.newType$1(Uniques.scala:64)
at dotty.tools.dotc.core.Uniques$NamedTypeUniques.enterIfNew(Uniques.scala:68)
at dotty.tools.dotc.core.Types$TypeRef$.apply(Types.scala:2538)
at dotty.tools.dotc.core.Types$NamedType$.apply(Types.scala:2514)
at dotty.tools.dotc.core.Types$NamedType.withPrefix(Types.scala:2361)
at dotty.tools.dotc.core.Types$NamedType.derivedSelect(Types.scala:2294)
at dotty.tools.dotc.core.Types$TypeMap.derivedSelect(Types.scala:4873)
at dotty.tools.dotc.core.Types$ApproximatingTypeMap.derivedSelect(Types.scala:5165)
at dotty.tools.dotc.core.TypeOps$AsSeenFromMap.op$1(TypeOps.scala:102)
at dotty.tools.dotc.core.TypeOps$AsSeenFromMap.apply(TypeOps.scala:110)
at dotty.tools.dotc.core.TypeOps$.asSeenFrom(TypeOps.scala:55)
at dotty.tools.dotc.core.Types$Type.asSeenFrom(Types.scala:901)
at dotty.tools.dotc.core.Types$Type.memberInfo(Types.scala:893)
at dotty.tools.dotc.typer.Synthesizer.$anonfun$3(Synthesizer.scala:282)
at scala.collection.immutable.List.map(List.scala:223)
at dotty.tools.dotc.typer.Synthesizer.productMirror(Synthesizer.scala:282)
Expectation
Should compile.