继我提出的另一个问题Scala 2.8 breakout之后,我想进一步了解TraversableLike[A].map
签名如下的 Scala 方法:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
请注意有关此方法的一些事项:
- 它需要一个函数将
A
可遍历中的每个转换为B
. - 它返回
That
并接受 type 的隐式参数CanBuildFrom[Repr, B, That]
。
我可以这样称呼它:
> val s: Set[Int] = List("Paris", "London").map(_.length)
s: Set[Int] Set(5,6)
我不能完全理解的是编译器如何强制执行绑定到的事实(That
即,它是 B 的一些集合)。类型参数看起来独立于上面的签名和特征本身的签名:B
CanBuildFrom
trait CanBuildFrom[-From, -Elem, +To]
Scala 编译器如何确保That
不能强制执行一些没有意义的事情?
> val s: Set[String] = List("Paris", "London").map(_.length) //will not compile
编译器如何决定CanBuildFrom
调用范围内的隐式对象?