|
| 1 | +class MySeq[T] { |
| 2 | + def map1[U](f: T => U): MySeq[U] = new MySeq[U] |
| 3 | + def map2[U](f: T => U): MySeq[U] = new MySeq[U] |
| 4 | +} |
| 5 | + |
| 6 | +class MyMap[A, B] extends MySeq[(A, B)] { |
| 7 | + def map1[C](f: (A, B) => C): MySeq[C] = new MySeq[C] |
| 8 | + def map1[C, D](f: (A, B) => (C, D)): MyMap[C, D] = new MyMap[C, D] |
| 9 | + def map1[C, D](f: ((A, B)) => (C, D)): MyMap[C, D] = new MyMap[C, D] |
| 10 | + |
| 11 | + def foo(f: Function2[Int, Int, Int]): Unit = () |
| 12 | + def foo[R](pf: PartialFunction[(A, B), R]): MySeq[R] = new MySeq[R] |
| 13 | +} |
| 14 | + |
| 15 | +object Test { |
| 16 | + val m = new MyMap[Int, String] |
| 17 | + |
| 18 | + // This one already worked because it is not overloaded: |
| 19 | + m.map2 { case (k, v) => k - 1 } |
| 20 | + |
| 21 | + // These already worked because preSelectOverloaded eliminated the non-applicable overload: |
| 22 | + m.map1(t => t._1) |
| 23 | + m.map1((kInFunction, vInFunction) => kInFunction - 1) |
| 24 | + val r1 = m.map1(t => (t._1, 42.0)) |
| 25 | + val r1t: MyMap[Int, Double] = r1 |
| 26 | + |
| 27 | + // These worked because the argument types are known for overload resolution: |
| 28 | + m.map1({ case (k, v) => k - 1 }: PartialFunction[(Int, String), Int]) |
| 29 | + m.map2({ case (k, v) => k - 1 }: PartialFunction[(Int, String), Int]) |
| 30 | + |
| 31 | + // These ones did not work before, still don't work in dotty: |
| 32 | + //m.map1 { case (k, v) => k } |
| 33 | + //val r = m.map1 { case (k, v) => (k, k*10) } |
| 34 | + //val rt: MyMap[Int, Int] = r |
| 35 | + //m.foo { case (k, v) => k - 1 } |
| 36 | + |
| 37 | + // Used to be ambiguous but overload resolution now favors PartialFunction |
| 38 | + def h[R](pf: Function2[Int, String, R]): Unit = () |
| 39 | + def h[R](pf: PartialFunction[(Double, Double), R]): Unit = () |
| 40 | + h { case (a: Double, b: Double) => 42: Int } |
| 41 | +} |
0 commit comments