Inferring тип общего неявного параметра из возвращаемого типа

Скажем, у меня есть простой класс, как это

abstract class Foo {
  implicit val impInt: Int = 42
  def f[A]()(implicit a: A): A
  val f2: Int = f()
}

При объявлении valf2Компилятор может сделать вывод, что тип неявного параметра функцииf являетсяInt потому что этот тип совпадает с типом результата, а тип результата должен соответствовать типу значенияf2, которыйInt.

Тем не менее, бросаяOrdering[A] в смесь:

def f[A]()(implicit a: A, m: Ordering[A]): A
val f2: Int = f()

приводит к этой ошибке компиляции:

Неоднозначные неявные значения: оба значения StringCanBuildFrom в объекте Predef типа => scala.collection.generic.CanBuildFrom [String, Char, String] и метод $ соответствуют объекту Predef типа [A] => <: <[A, A] соответствует ожидаемому типу A

Если я добавлю информацию о типе при вызовеf(), он компилирует:

val f2: Int = f[Int]()

Сначала я столкнулся со случаем с неявным упорядочением и подумал, что это связано с выводом Scala слева направо; Я думал, что это не в состоянии соответствовать типу возврата сначала изатем вывести (неявный) тип параметраf, Но потом я попробовал дело без неявного упорядочения и увидел, что это работает - это вывести, чтоf должен быть параметризованInt потому что тип возвращаемого значения должен бытьInt (так какf2 являетсяInt).

Обратите внимание, что если мы удалимimplicit a: A и оставить только неявный параметр Ordering, ошибка остается, но становится

Расхождение неявного расширения для типа Ordering [A], начиная с метода Tuple9 в объекте Ordering.

Снова, добавив параметр типа, чтобы он сталval f2: Int = f[Int]() помогает.

В чем дело? Почему компилятор может вывести этот параметрA должен бытьIntно не тот параметрOrdering[A] должен бытьOrdering[Int]?

Ответы на вопрос(1)

Ваш ответ на вопрос