Cómo "extraer" el parámetro de tipo para instanciar otra clase
El siguiente código Scala funciona:
object ReducerTestMain extends App {
type MapOutput = KeyVal[String, Int]
def mapFun(s:String): MapOutput = KeyVal(s, 1)
val red = new ReducerComponent[String, Int]((a: Int, b: Int) => a + b)
val data = List[String]("a", "b", "c", "b", "c", "b")
data foreach {s => red(mapFun(s))}
println(red.mem)
// OUTPUT: Map(a -> 1, b -> 3, c -> 2)
}
class ReducerComponent[K, V](f: (V, V) => V) {
var mem = Map[K, V]()
def apply(kv: KeyVal[K, V]) = {
val KeyVal(k, v) = kv
mem += (k -> (if (mem contains k) f(mem(k), v) else v))
}
}
case class KeyVal[K, V](key: K, value:V)
Mi problema es que me gustaría crear una instanciaReducerComponent
Me gusta esto:
val red = new ReducerComponent[MapOutput, Int]((a: Int, b: Int) => a + b)
o mejor:
val red = new ReducerComponent[MapOutput](_ + _)
Eso significa muchas cosas:
Me gustaría comprobar queMapOutput
es del tipoKeyVal[K, C]
,Quiero comprobar queC
es el mismo tipo usado enf
,También necesito "extraer"K
para instanciarmem
y parámetros de verificación de tipo deapply
.¿Es mucho pedir? :) Quería escribir algo como
class ReducerComponent[KeyVal[K,V]](f: (V, V) => V) {...}
Para el momento voy a instanciarReducerComponent
todo lo que tengo esf
yMapOutput
, por lo que inferir V está bien. Pero entonces solo tengoKeyVal[K,V]
como un parámetro de tipo de una clase, que puede ser diferente deKeyVal[_,_]
.
Sé que lo que estoy preguntando es probablemente una locura si entiendes cómo funciona la inferencia de tipos, ¡pero yo no! Y ni siquiera sé cuál sería una buena forma de proceder, aparte de hacer declaraciones de tipo explícitas en mi código de alto nivel. ¿Debo cambiar toda la arquitectura?