Scala映射函数签名的解释?

blu*_*sky 2 scala

此代码将函数应用于Ints列表,并将值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)) 
Run Code Online (Sandbox Code Playgroud)

地图签名:

   def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
Run Code Online (Sandbox Code Playgroud)

由于B是第一个类型参数(在map [B,That]中)这是否意味着它键入前缀操作数'l'(List)?

怎么打'A'?scala编译器是否以某种方式检查List'l'中的类型并推断其类型为Int?

怎么打'那个'?

pag*_*_5b 8

对于简单签名mapList[A]

def map[B](f: (A) ? B): List[B]
Run Code Online (Sandbox Code Playgroud)

意思就是

  • A 由实际列表的类型参数决定
    • Int 对于示例列表 l
  • Bf作为参数传递 的函数的目标类型确定
    • Option[Int] 用于示例功能 f: Int -> Option[Int]

扩展的签名是

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
Run Code Online (Sandbox Code Playgroud)

它存在,以便您可以在可以以某种方式遍历的容器之间进行一般映射,即使目标遍历具有与原始不同的形式.

一个具体的例子是遍历a Map作为容器Pairs,具有产生单个值的映射函数.生成的遍历Map不再是,因此CanBuildFrom隐式参数用于查找结果对象的"可用表示".

在这个签名中我们有

  • Repr 作为原始遍历容器的类型
  • B 作为包含值的目标类型,如简化签名中所示
  • That作为目标容器的类型,由CanBuildFrom在调用站点处具有正确类型的隐式存在确定