Scala 2.8 CanBuildA partir de
Depois de outra pergunta, perguntei:Scala 2.8 breakout, Eu queria entender um pouco mais sobre o método ScalaTraversableLike[A].map
cuja assinatura é a seguinte:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
Observe algumas coisas sobre esse método:
Leva uma função girando cadaA
no traversable em umB
.DevolveThat
e leva um argumento implícito do tipoCanBuildFrom[Repr, B, That]
.Eu posso chamar isso da seguinte maneira:
> val s: Set[Int] = List("Paris", "London").map(_.length)
s: Set[Int] Set(5,6)
o queEu não consigo entender é como o fato de queThat
élimite paraB
(isto é, é uma coleção de B's) está sendo aplicada pelo compilador. Os parâmetros de tipo parecem ser independentes da assinatura acima e da assinatura do traçoCanBuildFrom
em si:
trait CanBuildFrom[-From, -Elem, +To]
Como é o compilador Scala garantindo queThat
não pode serforçado em algo que não faz sentido?
> val s: Set[String] = List("Paris", "London").map(_.length) //will not compile
Como o compilador decide o que implícitoCanBuildFrom
objetos estão no escopo da chamada?