2016-04-09 10 views
4

にいくつかのメソッドを追加しようとしています。implicit classでpimpingしています。CanBuildFromでTraversableの暗黙のクラスを定義する方法は?

しかし、私はCanBuildFrom形質で失われています。次のことを考えてみましょう:

implicit class TraversableExt[+A, +Repr <: Traversable[A]](traversable: Repr) { 
    def debug[That](name: String)(implicit bf: CanBuildFrom[Repr, A, That]): That = 
    traversable.map{ a => println(name + ": " + a); a }(bf) 
} 

これはエラーで失敗します。

Error:(21, 59) type mismatch;
found : scala.collection.generic.CanBuildFrom[Repr,A,That]
required: scala.collection.generic.CanBuildFrom[Traversable[A],A,That]
traversable.map{ a => println(name + ": " + a); a }(bf) ^

私はCanBuildFrom[-Repr, -Elem, +To]Reprが反変であることから推測しているので、Traversable[A]によって上限れる私のReprが動作しない場合があります。

しかし全体的に、私はかなり失われています。誰も助けることができますか?

答えて

6

あなたはタイプinferencerを幸せにすると、それはCanBuildFromで動作させるためにTraversableLikeと高いkindedタイプを使用する必要があります。

implicit class TraversableExt[A, C[X] <: TraversableLike[X, C[X]]](traversable: C[A]) { 
    def debug[That](name: String)(implicit bf: CanBuildFrom[C[A], A, That]): That = 
    traversable.map{ a => println(name + ": " + a); a }(bf) 
} 

コンパイラが正しく総称的にあなたのコレクションC[A]の代わりの型を推論することができます1が渡されたとあなたは同じコレクションクラスを返すようにしたい場合は、経験則としてCanBuildFrom[Traversable[A],...]

を探して、あなたは*Likeクラスを使用する必要が

+1

うわー。ありがとうございました。 –

関連する問題