我正在编写一个名为的简单函数reduceByKey
,该函数采用(键,数字)对的集合并通过键返回减少的集合。
def reduceByKey[K](collection: Traversable[Tuple2[K, Int]]) = {
collection
.groupBy(_._1)
.map { case (group: K, traversable) => traversable.reduce{(a,b) => (a._1, a._2 + b._2)} }
}
这目前适用于:
scala> val col = List((("some","key"),100), (("some","key"),100), (("some","other","key"),50))
col: List[(Product with Serializable, Int)] = List(((some,key),100), ((some,key),100), ((some,other,key),50))
scala> reduceByKey(col)
res42: scala.collection.immutable.Map[Product with Serializable,Int] = Map((some,key) -> 200, (some,other,key) -> 50)
但是,一旦我想对数字使用非 Int 类型,它就会惨遭失败,因为它期望Int
.
scala> val col = List((("some","key"),100.toDouble), (("some","key"),100.toDouble), (("some","other","key"),50.toDouble))
col: List[(Product with Serializable, Double)] = List(((some,key),100.0), ((some,key),100.0), ((some,other,key),50.0))
scala> reduceByKey(col)
<console>:13: error: type mismatch;
found : List[(Product with Serializable, Double)]
required: Traversable[(?, Int)]
reduceByKey(col)
^
当然,我可以为不同的类型制定不同的方法,但这很愚蠢。基本上我希望我的方法适用于任何+
定义了方法的类型。那将是Double
, Float
,Long
和。Int
Short
- 起初,我认为我可以使用结构类型而不是 Int。但这意味着结构类型需要引用自身才能有任何用途。
- 我研究了我认为可能有用的数字特征。它封装了所有数字类型的 + 方法。但是,我不确定如何在我的情况下使用它。我不想强迫我的函数的用户将值包装在 Numeric 中,只是为了让我的函数正常工作。函数本身应该以某种方式隐式包装并调用
Numeric.plus
.
我愿意接受有关如何解决此问题的任何建议。