此代码将一个函数应用于Ints列表,并在List of Option中设置值为4的每个值:
val l = List(1,2,3,4,5) //> l : List[Int] =
val v = 4 //> v : Int = 4
def g(v:Int) = List(v-1, v, v+1) //> g: (v: Int)List[Int]
l map (x => {f(x);}) //> res0: List[Option[Int]] = List(Some(4), Some(4), Some(4), Some(4), Some(4))
地图签名:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
由于B是第一个类型参数(在map [B,那个]中)这是否意味着它键入了前缀操作数'l'(List)?
'A'打字怎么样? scala编译器是否以某种方式检查List'l'中的类型并推断其类型为Int?
'那'打字怎么样?
答案 0 :(得分:7)
map
中List[A]
的简单签名是
def map[B](f: (A) ⇒ B): List[B]
这意味着
A
由实际列表的类型参数决定
Int
示例列表l
B
由作为参数传递的函数f
的目标类型确定
Option[Int]
示例函数f: Int -> Option[Int]
扩展签名是
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
存在,以便您可以通过某种方式在可以遍历的容器之间进行一般映射,即使目标可遍历的格式与原始格式不同。
一个具体示例是将
Map
作为Pairs
的容器遍历, 使用生成单个值的映射函数。所结果的 遍历不再是Map
,因此隐含CanBuildFrom
参数用于查找“可用表示” 结果对象。
在此签名中我们有
Repr
作为原始遍历容器的类型B
作为包含值的目标类型,如简化签名That
作为目标容器的类型,由在调用站点具有正确类型的CanBuildFrom
的隐式存在确定