Wie man Typparameter "extrahiert", um eine andere Klasse zu instanziieren

Der folgende Scala-Code funktioniert:

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)

Mein Problem ist, ich möchte instanziierenReducerComponent so was

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

oder noch besser:

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

Das bedeutet eine Menge Dinge:

Ich möchte überprüfen, dassMapOutput ist vom TypKeyVal[K, C],Ich möchte überprüfen, dassC ist derselbe Typ wie inf,Ich muss auch "extrahieren"K um @ zu instanziiermem und Typprüfparameter vonapply.

Ist es viel zu fragen? :) Ich wollte so etwas wie @ schreib

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

Bis zu der Zeit werde ich instanziierenReducerComponent alles was ich habe istf undMapOutput, also ist es in Ordnung, auf V zu schließen. Aber dann habe ich nurKeyVal[K,V] als Typparameter aus einer Klasse, die sich von @ unterscheiden kaKeyVal[_,_].

Ich weiß, was ich frage, ist wahrscheinlich verrückt, wenn Sie verstehen, wie Typinferenz funktioniert, aber ich nicht! Und ich weiß nicht einmal, wie ich vorgehen soll - abgesehen davon, dass ich explizite Typdeklarationen in meinem übergeordneten Code mache. Sollte ich einfach die gesamte Architektur ändern?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage