Scala映射函数签名的解释?

时间:2013-08-30 11:33:16

标签: scala

此代码将一个函数应用于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?

'那'打字怎么样?

1 个答案:

答案 0 :(得分:7)

mapList[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的隐式存在确定