2

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

地图签名:

   def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {

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

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

“那个”是怎么打的?

4

1 回答 1

9

mapin a的简单签名List[A]

def map[B](f: (A) ⇒ B): List[B]

意思就是

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

扩展签名是

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That

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

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

在这个签名中,我们有

  • Repr作为原始遍历容器的类型
  • B作为包含值的目标类型,如在简化签名中
  • That作为目标容器的类型,由CanBuildFrom调用站点上具有正确类型的 a 的隐式存在确定
于 2013-08-30T12:54:39.730 回答