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 instanciarmemy 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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta