Como "extrair" o parâmetro de tipo para instanciar outra classe

O seguinte 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)

Meu problema é que eu gostaria de instanciarReducerComponent como isso:

val red = new ReducerComponent[MapOutput, Int]((a: Int, b: Int) => a + b)

ou melhor ainda:

val red = new ReducerComponent[MapOutput](_ + _)

Isso significa muitas coisas:

Eu gostaria de verificar seMapOutput é do tipoKeyVal[K, C],Eu quero digitar queC é o mesmo tipo usado emf,Eu também preciso "extrair"K para instanciarmeme parâmetros de verificação de tipo deapply.

É pedir muito? :) eu queria escrever algo como

class ReducerComponent[KeyVal[K,V]](f: (V, V) => V) {...}

Quando eu instanciarReducerComponent tudo o que tenho éf eMapOutput, portanto, inferir V é OK. Mas então eu só tenhoKeyVal[K,V] como um parâmetro de tipo de uma classe, que pode ser diferente deKeyVal[_,_].

Sei que o que estou perguntando é provavelmente louco, se você entende como a inferência de tipo funciona, mas eu não! E eu nem sei o que seria uma boa maneira de proceder - além de fazer declarações explícitas de tipo até o meu código de alto nível. Devo apenas mudar toda a arquitetura?

questionAnswers(2)

yourAnswerToTheQuestion