Implizite Parameterauflösung für höherwertige Typen

Betrachten Sie den folgenden Code:

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

Dies funktioniert, aber ich muss Some (42) als Option [Int] eingeben, andernfalls wird das implizite Objekt OptionBar nicht aufgelöst (da stattdessen ein Balken [Some] erwartet wird). Gibt es eine Möglichkeit, die explizite Eingabe zu vermeiden, sodass ich das implizite OptionBar-Objekt im Test erhalte, auch wenn ich test mit Some oder None füttere?

[Klärung

Ich habe Option hier nur als Beispiel verwendet, es sollte auch funktionieren, wenn ich ein @ haBar für eine abstrakte Klasse usw. Die Lösung sollte auch funktionieren, wenn andere, nicht verwandte Balken im Geltungsbereich sind, z. B.implicit object listBar extends Bar[list]

[Aktualisieren

Es scheint, als würde es den Trick machen, den Parameter von Bar kontravariant zu machen:

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

Aber dies ist natürlich eine schwerwiegende Einschränkung der Möglichkeiten in Bar, deshalb hoffe ich immer noch auf eine bessere Antwort.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage