继续我之前提出的另一个问题 Scala 2.8 breakout, 我想更了解一下Scala方法TraversableLike[A].map
,其签名如下:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
注意这个方法的一些细节:
- 它接受一个将遍历器中的每个
A
转换为B
的函数。 - 它返回
That
并且需要一个类型为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
不能被迫转换成不合理的东西?Scala编译器如何确保
That
不能被强制转换成无意义的内容?> val s: Set[String] = List("Paris", "London").map(_.length) //will not compile
编译器如何决定在调用时有哪些隐式的CanBuildFrom
对象在范围内?