Неявное разрешение параметров для типов с более высоким родом
Рассмотрим следующий код:
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
для абстрактного класса и т. д.Решение должно также работать, когда другие, не связанные бары находятся в области действия, скажем,implicit object listBar extends Bar[list]
[Обновить]
Кажется, что создание параметра Бара контравариантным делает свое дело:
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))
}
}
Но, конечно, это серьезное ограничение возможностей в баре, поэтому я все еще надеюсь на лучший ответ.