Неявное разрешение параметров для типов с более высоким родством

Рассмотрим следующий код:

object foo {

    trait Bar[Q[_]]

    implicit object OptionBar extends Bar[Option]

    def test[T, C[_]](c: C[T])(implicit bar: Bar[C]) = ()

    def main(args: Array[String]) {
      test(Some(42): Option[Int])  //???
    }
}

Это работает, но мне нужно ввести Some (42) как Option [Int], иначе неявный объект OptionBar не будет разрешен (потому что вместо этого ожидается Bar [Some]). Есть ли способ избежать явной типизации, чтобы я получал неявный объект OptionBar в тесте, даже если я загружаю тест с помощью Some или None?

[Уточнение]

  • Я использовал здесь Option в качестве примера, он также должен работать, если у меня есть Bar для абстрактного класса и т. Д.
  • Решение также должно работать, когда другие, не связанные с ним Полосы входят в область видимости, скажем, неявный объект listBar extends Bar [list]

[Обновление]

Похоже, что создание контравариантного параметра Bar помогает:

object foo {

  trait Bar[-Q[_]] //<---------------

  implicit object OptionBar extends Bar[Option]
  implicit object ListBar extends Bar[List]

  def test[T, C[_]](c: C[T])(implicit bar: Bar[C]) = ()

  def main(args:Array[String]) {
    test(Some(42))
  }
}

Но, конечно, это серьезное ограничение возможностей Bar, поэтому я все еще надеюсь на лучший ответ.

9
задан 0__ 1 July 2012 в 09:22
поделиться