2016-04-09 14 views
4

implicit class aracılığıyla pimping yaparak Traversable özelliğine bazı yöntemler eklemeye çalışıyorum.CanBuildFrom ile Traversable için örtülü sınıf nasıl tanımlanır?

Ama ben CanBuildFrom özelliğiyle bir tür kayıpım. Aşağıdaki düşünün: hatayla Bu başarısız

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) 
} 

: Ben CanBuildFrom[-Repr, -Elem, +To] içinde Repr kontravaryant ve beri dolayısıyla benim Traversable[A] by-üst bağlıdır Repr çalışmayabilir olduğunu tahmin ediyorum

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) ^

. Ama genel olarak oldukça kayboldum. Biri yardım edebilir mi?

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) 
} 

derleyici doğru koleksiyonunuzu C[A] tipini anlaması için artık yapabiliyor yerine jenerik:

cevap

6

Bunu CanBuildFrom ile çalışmak tipi inferencer mutlu etmek TraversableLike ve daha yüksek kinded türlerini kullanmak ve yapmak zorunda tek geçirilen gibi aynı koleksiyon sınıfı dönmek istediğinizde, kural olarak bir CanBuildFrom[Traversable[A],...]

için bak, *Like sınıfları kullanmak zorunda

+1

Vay canına. Teşekkür ederim. –

İlgili konular