Почему этот вызов неявно неоднозначен?

Сигнатура метода sum в TraversableOnce выглядит следующим образом:

def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)

Я могу использовать его так:

scala> (1 to 10).sum
res0: Int = 55

В этом случае компилятор внедряет сам Numeric [B] , поэтому в области должно быть недвусмысленное неявное значение этого типа. Если я использую Predef.implicitly , чтобы ввести его сам, то происходит следующее:

scala> (1 to 10).sum(implicitly)
<console>:6: error: ambiguous implicit values:
 both method conforms in object Predef of type [A]<:<[A,A]
 and method stringCanBuildFrom in object Predef of type => scala.collection.generic.CanBuildFrom[String,Char,String]
 match expected type T
   (1 to 10).sum(implicitly)
                 ^

Почему это неоднозначно?

Я могу устранить неоднозначность либо с помощью

scala> (1 to 10).sum(implicitly[Numeric[Int]])
res2: Int = 55

, либо

scala> (1 to 10).sum[Int](implicitly)
res3: Int = 55

, я предполагаю, что это имеет какое-то отношение к тому факту, что sum объявляет новый параметр типа B>: A ( это явно так, см. ниже edit ), но я все еще не понимаю, почему что-то может быть однозначно найденным в первом примере, но не во втором?

ИЗМЕНИТЬ - , чтобы устранить бессмысленный комментарий субподраздела (ниже)

scala> class As[A](as : A*) { 
 | def sum(implicit num : Numeric[A]) : A = as.foldLeft(num.zero)(num.plus) 
 | }
defined class As

scala> (new As(1, 2, 3, 4)).sum
res0: Int = 10

scala> (new As(1, 2, 3, 4)).sum(implicitly)
res1: Int = 10

Итак, вы можете видеть, что это не тот случай, когда любой вызов неявно является неоднозначным

11
задан oxbow_lakes 6 April 2011 в 13:34
поделиться