Faisant suite à une autre question que je posais, Scala 2.8 breakout, je voulais comprendre un peu plus sur la méthode Scala TraversableLike[A].map
dont la signature est la suivante:Scala 2.8 CanBuildFrom
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
avis quelques choses sur cette méthode :
- Il prend une fonction en transformant chaque
A
dans le cheminement enB
. Il renvoieThat
et prend un argument implicite de typeCanBuildFrom[Repr, B, That]
.
Je peux appeler cela comme suit:
> val s: Set[Int] = List("Paris", "London").map(_.length)
s: Set[Int] Set(5,6)
Qu'est-ce Je ne peux pas tout à fait saisissais est comment le fait que That
est lié-B
(qui est, il est une collection de B) est en train d'être appliqué par le compilateur. Les paramètres de type semblent être indépendant de la signature ci-dessus et de la signature du trait CanBuildFrom
lui-même:
trait CanBuildFrom[-From, -Elem, +To]
Comment le compilateur Scala assurant que That
ne peut pas être forcé en quelque chose qui n'a pas de sens?
> val s: Set[String] = List("Paris", "London").map(_.length) //will not compile
Comment le compilateur décider quels objets CanBuildFrom
implicites sont dans la portée de l'appel?
Voici le poste avec une explication très agréable http://blog.bruchez.name/2012/08/getting-to-know-canbuildfrom-without-phd.html –
Pour mémoire, une telle utilisation a un nom conceptuel: polymorphisme du type de retour. – lcn