Как «извлечь» параметр типа для создания экземпляра другого класса
Работает следующий код 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[_,_]
.
Я знаю, что я спрашиваю, возможно, это безумие, если вы понимаете, как работает вывод типа, но я не знаю! И я даже не знаю, что было бы хорошим способом продолжить - кроме как делать явные объявления типов в моем высокоуровневом коде. Должен ли я просто изменить всю архитектуру?