Неявное преобразование универсального контейнера для неявного параметра в Scala - PullRequest
4 голосов
/ 12 марта 2011

Есть ли способ заставить эту работу?(Scala 2.8.1)

class A
def f(implicit a: A) = 0

class Vendor[T](val v: T)
implicit val vendor = new Vendor(new A)
implicit def vendorToVal[T](implicit v: Vendor[T]) = v.v
f

Ошибка: «расходится неявное расширение для типа A, начиная с метода vendorToVal»

Это связано с внедрением зависимостей Lift 2.2, реальный код выглядиткак это:

class UserStore(implicit db: DbAccess)
object DependencyFactory extends Factory {
  implicit val db = new FactoryMaker[DbAccess](Model) {}
  import db._ // implicit conversion would allow to remove this import

  implicit val userStore = new FactoryMaker[UserStore](new UserStore) {}
}

Этот вопрос относится к: Есть ли способ неявного преобразования неявного параметра в Scala?

Ответы [ 2 ]

3 голосов
/ 12 марта 2011

Проблема вызвана методом vendorToVal - я наблюдал такое же поведение много раз, когда я использовал неявные параметры в неявных параметризованных методах.К сожалению, я не нашел простого и элегантного клея в 2.8 ._.

Некоторые интересные темы, связанные с темой:

  1. http://scala -programming-language.1934581.n4.nabble.com / scala-почему-это-расходится-неявно-td1998156.html
  2. http://www.scala -lang.org / node / 6847
1 голос
/ 12 марта 2011

В магистрали Scala 2.9 вы можете сделать это:

scala> class A
defined class A

scala> def f(implicit a: A) = 0
f: (implicit a: A)Int

scala> 

scala> class Vendor[T](val v: T)
defined class Vendor

scala> implicit def value[T: Vendor] = implicitly[Vendor[T]].v
value: [T](implicit evidence$1: Vendor[T])T

scala> implicit val vendor = new Vendor(new A)
vendor: Vendor[A] = Vendor@bbb2d0

scala> f
res0: Int = 0

Вызов f найдет значение типа A и найдет неявное value[A], для которого требуется параметр доказательстватипа Vendor[A].Он разрешает этот параметр доказательства до vendor.

Я не думаю, что последствия были настолько сильными в 2.8.1.

...