Как «извлечь» параметр типа для создания экземпляра другого класса

Работает следующий код Scala:

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)

Моя проблема в том, что я хотел бы создать экземплярReducerComponent как это:

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

или даже лучше:

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

Это значит много вещей:

Я хотел бы проверить, чтоMapOutput имеет типKeyVal[K, C],Я хочу, чтобы проверить, чтоC тот же тип, используемый вf,Мне тоже нужно "извлечь"K для того, чтобы создать экземплярmemи параметры проверки типа изapply.

Много ли спросить? :) Я хотел написать что-то вроде

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

К тому времени я буду создаватьReducerComponent все что у меня естьf а такжеMapOutputТаким образом, вывод V в порядке. Но тогда у меня есть толькоKeyVal[K,V] как параметр типа из класса, который может отличаться отKeyVal[_,_].

Я знаю, что я спрашиваю, возможно, это безумие, если вы понимаете, как работает вывод типа, но я не знаю! И я даже не знаю, что было бы хорошим способом продолжить - кроме как делать явные объявления типов в моем высокоуровневом коде. Должен ли я просто изменить всю архитектуру?

Ответы на вопрос(2)

Ваш ответ на вопрос