私は、基本的なコレクションを強化するライブラリ関数をいくつか記述しようとしています。それのほとんどはスムーズに行っていますが、私はこの問題を抱えています。スカラー:エラー:パラメータのタイプがありません
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が別のパラメータを解決するために1つのパラメータを使用しないことを示していますが、別のパラメータリストで問題を解決できることを示しています。しかし、私の場合は、型情報が暗黙的なパラメータにあるので、これはあまり簡単ではありません。
私はメソッドを呼び出すたびにタイプを指定する必要がないので、これを回避する方法はありますか?
更新:オーウェンの助言に基づいて、私はペアのトラバースに特有の豊かなクラスを作成することになった:
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)
素晴らしい答えをありがとう!私は物事を2つの "強化された"クラスに分割してしまったので、GenTraversableLike((T、U)、Repr)に固有のクラスを持つことができました。これはあなたが示したように問題を克服し、概念的にも清潔です。 – dhg