2013-08-30 35 views
2

此代码适用于整数的列表的功能,并设置每个值在选项的列表具有值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是第一类型的参数(在地图[B,That])这是否意味着它的类型为前缀操作数'l'(List)?

'A'是怎么输入的? Scala编译器是否会检查List'l'中的类型并推断出它的类型为Int?

'那'是怎么输入的?

+0

[Scala 2.8 breakout]的可能重复(http://stackoverflow.com/questions/1715681/scala-2-8-breakout) – senia

+0

在你的代码中,函数f是什么?函数g的用法是什么?如果您查看List的API文档,您可以看到该映射具有以下签名:def map [B](f:(A)⇒B):List [B]:它仅转换列表中的A列表的B – bhericher

+2

请参阅**关于'[这个答案](http://stackoverflow.com/a/1716558/406435)中的'CanBuildFrom' **部分[Daniel C. Sobral](http://stackoverflow.com/users/53013 /丹尼尔-C-索布拉尔)。 – senia

回答

7

用于mapList[A]简单签名是

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

这意味着

  • A由实际列表
    • Int为示例列表l类型参数确定
  • B由作为参数
    • Option[Int]被传为例如函数的函数f的目标类型确定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决定,在呼叫站点有正确的类型