【发布时间】:2009-11-12 10:38:22
【问题描述】:
继我提出的另一个问题 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 不会被强制 变成没有意义的东西?
> val s: Set[String] = List("Paris", "London").map(_.length) //will not compile
编译器如何确定哪些隐式 CanBuildFrom 对象在调用范围内?
【问题讨论】:
-
这是一篇解释得很好的帖子blog.bruchez.name/2012/08/…
-
为了记录,这种用法有一个概念名称:返回类型多态性。