我试图编写一些库函数来增强基本集合。它大部分进展顺利,但我遇到了这个问题。斯卡拉:错误:缺少参数类型
class EnhancedGenTraversableLike[A, Repr <: GenTraversable[A]](self: GenTraversableLike[A, Repr]) {
def mapValuesStrict[T, U, R, That](f: U => R)(implicit ev: A <:< (T, U), bf: CanBuildFrom[Repr, (T, R), That]) = {
val b = bf(self.asInstanceOf[Repr])
b.sizeHint(self.size)
for ((k: T, v: U) <- self) b += k -> f(v)
b.result
}
}
implicit def enhanceGenTraversableLike[A, Repr <: GenTraversable[A]](self: GenTraversableLike[A, Repr]) = new EnhancedGenTraversableLike[A, Repr](self)
这里是当我去使用它会发生什么:
scala> List((1,2),(2,3),(3,4),(2,5)).mapValuesStrict((_:Int).toString)
res0: List[(Int, java.lang.String)] = List((1,2), (2,3), (3,4), (2,5))
scala> List((1,2),(2,3),(3,4),(2,5)).mapValuesStrict(x => x.toString)
<console>:13: error: missing parameter type
List((1,2),(2,3),(3,4),(2,5)).mapValuesStrict(x => x.toString)
^
所以Scala是无法确定的x
类型。
This answer指示Scala不使用一个参数来解析另一个参数,但是单独的参数列表可以解决该问题。然而,就我而言,这并不容易,因为类型信息可以在隐式参数中找到。
是否有解决方法,以便我不必每次调用方法时指定类型?
更新:根据欧文的建议,我结束了创建具体到对一笔画一个丰富的类:
class EnrichedPairGenTraversableLike[T, U, Repr <: GenTraversable[(T, U)]](self: GenTraversableLike[(T, U), Repr]) {
def mapValuesStrict[R, That](f: U => R)(implicit bf: CanBuildFrom[Repr, (T, R), That]) = {
val b = bf(self.asInstanceOf[Repr])
b.sizeHint(self.size)
for ((k: T, v: U) <- self) b += k -> f(v)
b.result
}
}
implicit def enrichPairGenTraversableLike[T, U, Repr <: GenTraversable[(T, U)]](self: GenTraversableLike[(T, U), Repr]) = new EnrichedPairGenTraversableLike(self)
感谢伟大的答案!我最终将事情分成两个“增强”类,所以我可以有一个特定于'GenTraversableLike [(T,U),Repr]'的类。这显示了克服了这个问题,并且在概念上也很干净。 – dhg 2012-02-01 05:44:56