Resolução implícita de parâmetros para tipos mais elevados

Considere o seguinte código:

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])  //???
    }
}

Isso funciona, mas eu preciso digitar Some (42) como Option [Int], caso contrário, o objeto implícito OptionBar não será resolvido (porque uma barra [Some] é esperada). Existe uma maneira de evitar a digitação explícita, para que eu ponha o objeto OptionBar implícito em teste, mesmo que eu alimente o teste com Some ou None?

[Esclarecimento]

Eu usei Option aqui apenas como exemplo, também deve funcionar se eu tiver umBar para uma aula abstrata etc.A solução também deve funcionar quando outras barras não relacionadas estiverem no escopo, digamosimplicit object listBar extends Bar[list]

[Atualizar]

Parece que tornar o parâmetro de Bar contraditório faz o truque:

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

Mas é claro que essa é uma limitação severa das possibilidades no Bar, por isso ainda espero uma resposta melhor.

questionAnswers(2)

yourAnswerToTheQuestion