我对Scala中的上下文边界还是个新手,我正在尝试编写一个函数,它可以对任何满足上下文边界的泛型执行reduceByKey。例如
def myReduce[K: ClassTag, V: ClassTag: Numeric[V]](in: RDD[(K, V)]): RDD[(K, V)] = {
in.reduceByKey{case (v1, v2) =>
implicityly[Numeric[V]].plus(v1, v2)
}
据我所知,这应该是可行的,但当我试图编译时,我得到了以下错误。
- 错误:找不到参数e:Numeric的隐式值
- 错误:Numeric[V]不接受类型参数
这些我不明白。我不会在任何地方将类型参数传递给Numeric[V]。上下文绑定不应该自动导入转换的"证据"吗?
我希望最终使用我自己的特质,而不是数字。
编辑:
我试着在函数中显式地写下隐含的evdience,如下所示:
def myReduce[K: ClassTag, V: ClassTag](in: RDD[(K, V)])(implicit ev: V => Numeric[V]): RDD[(K, V)] = {
in.reduceByKey{case (v1, v2) =>
implicityly[Numeric[V]].plus(v1, v2)
}
但我仍然得到"错误:找不到参数e:Numeric的隐式值"的错误。
好的,所以我解决了问题
def myReduce[K: ClassTag, V: ClassTag: Numeric](in: RDD[(K, V)]): RDD[(K, V)] = {
in.reduceByKey{case (v1, v2) =>
implicityly[Numeric[V]].plus(v1, v2)
}
问题是指定Numeric[V]而不仅仅是Numeric。我现在遇到了更多的问题,但那是另一天的事了。