Почему Scala не может найти вторичное неявное значение в этом конкретном случае?

Мне трудно объяснить разницу в поведении между дополнительные неявные значения, которые ищут либо первичное неявное значение, либо неявное преобразование. В частности, это работает:

trait Foo[A]
implicit def fooString: Foo[String] = null

implicit def value[A](implicit foo: Foo[A]) = 5

> implicitly[Int]
5

Но это не так:

implicit def conversion[A](x: Int)(implicit foo: Foo[A]) = new {
    def aMethod = 5
}

> 1.aMethod
could not find implicit value for parameter foo: test.Foo[A]

Варьируется:

  • Независимо от того, запускается ли поиск неявно или неявным преобразованием
  • Является ли искомое вторичное неявное значение полиморфным
  • Является ли предоставленное вторичное неявное значение полиморфным

Я получаю следующие результаты:

Conversion/value  Searching for  Supplied | Works?
----------------  -------------  -------- | ------
     conversion     poly          poly    |  yes
     conversion     poly          mono    |  **no**
     conversion     mono          poly    |  yes
     conversion     mono          mono    |  yes
     value          poly          poly    |  yes
     value          poly          mono    |  yes
     value          mono          poly    |  yes
     value          mono          mono    |  yes

Как видите, единственный случай, который не работает, - это когда начинается поиск при неявном преобразовании искомое значение полиморфно, но значение поставляемый является мономорфным.

Есть ли теоретическая причина, почему это должно быть так, или это ошибка / ограничение Scala?

8
задан retronym 4 February 2012 в 14:16
поделиться