Considere el siguiente código:resolución parámetro implícito para los tipos más altos kinded
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]) //???
}
}
Esto funciona, pero necesita escribir el Algunos (42) como opción [Int], de lo contrario el objeto implícito OptionBar no será resuelto (porque en su lugar se espera una barra [Algunos]). ¿Hay alguna manera de evitar el tipado explícito, de forma que obtengo el objeto OptionBar implícito en prueba incluso si realizo la prueba con Some o None?
[Aclaración]
- que usa la opción aquí sólo como ejemplo, también debería funcionar si tengo un
Bar
para una clase abstracta etc. - La solución también debe trabajar cuando otros no relacionados Bares, son en su alcance, decir
implicit object listBar extends Bar[list]
[actualización]
parece que hacer contravariant parámetro de barra hace t que truco:
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))
}
}
Pero por supuesto, esto es una grave limitación de las posibilidades de bar, así que todavía hay esperanza para una mejor respuesta.
¿Por qué la contravarianza es una limitación grave? Sin usarlo, Bar es invariante. Si intentas usar Bar como una clase de tipo contra tipos de alto nivel, la contravariancia parece encajar en mi mente. Eso es, por supuesto, hasta que quieras tratar las subclases de manera diferente. Sin embargo, en ese caso, todavía tiene otros trucos, como "prioridades" de resolución implícita – jsuereth
@Josh: considere algo así como 'barra de rasgo [Q [_]] {def cero [T]: Q [T]}', sin ajustar Ninguna y Nil en mis ejemplos. Pero no puedo tener ese método en Bar, si defino Q como contravariante. Cuando sepa cómo resolver esto, hágamelo saber ... – Landei
Además, para una clase de tipo naturalmente contravariante, como 'Igual [T]', la búsqueda implícita favorecerá 'Igual [Animal]' sobre 'Igual [Perro] ': http://www.scala-lang.org/node/4626. Las clases de herencia y tipo son realmente difíciles de combinar. – retronym