Aladdin - Scala Bugtracking
[#1176] project: compiler priority: medium category: bug
submitter assigned to status date submitted
Nikolay Martin noise 2007-06-17 18:26:33.0
subject Type inference problem with overloading
code
class Test {
  def f(x: Int, y: Int): Int = x + y
  def f(x: Double, y: Double): Double = x + y

  def foobar(xs: List[Int]): Int = xs.reduceLeft(f)
}
what happened
infer.scala:5: error: ambiguous reference to overloaded definition,
both method f in class Test of type (Double,Double)Double
and  method f in class Test of type (Int,Int)Int
match expected type (?, ?) => ?
  def foobar(xs: List[Int]): Int = xs.reduceLeft(f)
                                                 ^
one error found
what expected Compiler should infer f(Int, Int)Int as a precise match. BTW, throw in a third definition f(Float,Float)Float and f(Int,Int)Int doesn't even show up in the error message (only the Double and Float versions)!
[back to overview]
Changes of this bug report
Martin  edited on  2007-06-18 10:06:13.0
This behavior is actually as spec'ed. The problem is in the type of reduceLeft which is too polymorphic: def reduceLeft[B >: A](f: (B, B) => B): B So `f' is typed with expected type (?, ?) => ?. We can't tighten the type of `reduceLeft' either because that would violate variance restrictions of Lists type parameter A.