Skip to content

Allow implicit matches to bind type variables #5405

Closed
@odersky

Description

@odersky

This test case currently fails:

object Mapper {

  class MapTo[A, B](val f: A => B)

  inline def mapOne[X](x: X) = implicit match {
    case m: MapTo[X, y] => m.f(x)
  }

  inline def mapTuple[Xs <: Tuple](xs: Xs) <: Tuple = xs match {
    case xs: (x1 *: xs1) =>
      implicit match {
        case m: MapTo[`x1`, y] => m.f(xs.head.asInstanceOf[x1]) *: mapTuple(xs.tail : xs1)
      }
    case () =>
      ()
  }
}
object Test extends App {
  import Mapper._

  val xs = (1, "hello")

  locally {
    implicit val i1: MapTo[Int, Double] = new MapTo[Int, Double](_.toDouble)
    implicit val i2: MapTo[String, Boolean] = new MapTo[String, Boolean](_.length > 3)

    val r1 = mapOne[X = Int](1)

    val r2 = mapTuple(xs)
  }

}

The problem is that in the type pattern MapTo[X, y] of the implicit match case

   case m: MapTo[X, y] => m.f(x)

the y is bound to a GADT bound TypeRef. But the implicit search only knows how to constrain TypeParamRefs.

Hopefully, we get closer to a solution by identifying GADT bound and constrained variables.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions