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

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

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))
  }
}

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

 retronym30 сент. 2010 г., 11:44
Кроме того, для естественно-контравариантного класса типа, такого какEqual[T]неявный поиск будет благоприятствоватьEqual[Animal] надEqual[Dog]: scala-lang.org/node/4626, Классы наследования и типа действительно сложно объединить.
 Landei30 сент. 2010 г., 09:19
@Josh: рассмотрим что-то вродеtrait Bar[Q[_]] { def zero[T]:Q[T] }Возвращаюсь None и Nil в моих примерах. Но у меня не может быть такого метода в Bar, если я определю Q как контравариантный. Если вы знаете, как решить эту проблему, пожалуйста, дайте мне знать ...
 jsuereth30 сент. 2010 г., 02:48
Почему контравариантность является серьезным ограничением? Не используя его, тогда Бар инвариантен. Если вы пытаетесь использовать Bar как класс типов против типов с более высоким родом, эта противоположность, кажется, подходит мне в голову. Это, конечно, пока вы не хотите относиться к подклассам по-другому. Однако в этом случае у вас все еще есть другие приемы, такие как неявное разрешение «приоритетов»

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

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