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.