Opierając się na innym pytaniem spytałem Scala 2.8 breakout, chciałem zrozumieć nieco więcej o sposobie Scala TraversableLike[A].map
której podpis jest w następujący sposób:Scala 2,8 CanBuildFrom
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
zauważyć kilka rzeczy na temat tej metody :
- zajmuje funkcję skrętu każdy
A
w przesuwny doB
. - Zwraca
That
i przyjmuje niejawny argument typuCanBuildFrom[Repr, B, That]
.
mogę nazwać to w następujący sposób:
> val s: Set[Int] = List("Paris", "London").map(_.length)
s: Set[Int] Set(5,6)
Co nie mogę zupełnie pojąć sposób fakt, że That
jest związany do B
(to znaczy, że jest jakiś zbiór B) jest wymuszany przez kompilator. Parametry Typ wyglądać być niezależny zarówno od podpisania powyżej podpisania cechą CanBuildFrom
samego:
trait CanBuildFrom[-From, -Elem, +To]
Jak kompilator Scala zapewniającej That
nie może być zmuszony do czegoś, co nie ma sensu?
> val s: Set[String] = List("Paris", "London").map(_.length) //will not compile
jaki sposób kompilator zdecydować, jakie przedmioty są ukryte CanBuildFrom
w zakresie do rozmowy?
Oto post z całkiem ładnym wyjaśnienia http://blog.bruchez.name/2012/08/getting-to-know-canbuildfrom-without-phd.html –
Dla przypomnienia, takie użytkowanie ma nazwa pojęciowa: polimorfizm typu powrotu. – lcn