Dada una tupla con elementos de tipo A
y otro tipo parametrizado en A
:tipo extraño desajuste cuando se utiliza el acceso de miembros en lugar de extractor de
trait Writer[-A] { def write(a: A): Unit }
case class Write[A](value: A, writer: Writer[A])
y un sitio de uso:
trait Cache { def store[A](value: A, writer: Writer[A]): Unit }
¿Por qué la siguiendo el trabajo como se esperaba, usando el extractor de la tupla:
def test1(set: Set[Write[_]], cache: Cache): Unit =
set.foreach {
case Write(value, writer) => cache.store(value, writer)
}
Pero la siguiente falla:
def test2(set: Set[Write[_]], cache: Cache): Unit =
set.foreach { write =>
cache.store(write.value, write.writer)
}
con el mensaje de error
found : Writer[_$1] where type _$1
required: Writer[Any]
cache.store(write.value, write.writer)
^
¿Puedo fijar la segunda forma (test2
) para compilar correctamente?
EDITAR
Partiendo de las ideas de Owen que probé si puedo hacer que funcione sin la coincidencia de patrones en absoluto (que es lo que quería en primer lugar). Aquí hay dos casos más extraños, uno de trabajo, el otro no:
// does not work
def test3(set: Set[Write[_]], cache: Cache): Unit = {
def process[A](write: Write[A]): Unit =
cache.store(write.value, write.writer)
set.foreach(process)
}
// _does work_
def test4(set: Set[Write[_]], cache: Cache): Unit = {
def process[A](write: Write[A]): Unit =
cache.store(write.value, write.writer)
set.foreach(w => process(w))
}
Sigue siendo bastante oscuro para mí ...
Gracias por la explicación. Su primera solución no es aplicable, porque cada escritura tendrá un parámetro de tipo diferente. Tu segunda solución es viable. –
Todavía no entiendo realmente lo que está pasando. Ver mi edición a la pregunta. Es por eso que me gusta mantener la pregunta abierta un poco más. –