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

Подпись 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

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

РЕДАКТИРОВАТЬ - для ответа на комментарий в подзаголовке (ниже)

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

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

Ответ 1

Короткий ответ: из-за B >: A результата для implicitly вызов не может быть выведен.

Более длинный ответ. Если аргумент, определяемый как implicit, отсутствует, компилятор будет искать текущую область для любого неявного значения типа Numeric[B >: Int] и будет использовать наиболее конкретные - Numeric[Int].

Но если вы укажете аргумент как implicitly (вызов implicitly [T] (implicit e: T) : T), сначала должен быть разрешен аргумент типа T. И scala время выполнения явно не делает этого.

Это то же самое, что вызывать это:

scala> var f = implicitly
 <console>:5: 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
       var f = implicitly
               ^