【问题标题】:Explanation of Scala map function signature?Scala map 函数签名的解释?
【发布时间】:2013-09-03 02:57:12
【问题描述】:

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

“那个”是怎么打的?

【问题讨论】:

  • Scala 2.8 breakout 的可能重复项
  • 在你的代码中,函数f是什么?函数g有什么用?如果您查看 List 的 API 文档,您会发现 map 具有以下签名: def map[B](f: (A) ⇒ B): List[B] :它只是将 A 的列表转换为列表B
  • 参见this answerDaniel C. Sobral中的关于'CanBuildFrom`部分。

标签: scala


【解决方案1】:

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

存在这样您就可以在可以以某种方式遍历的容器之间进行通用映射,即使目标 traversable 的形式与原始形式不同。

一个具体的例子是遍历一个Map作为Pairs的容器, 使用产生单个值的映射函数。所结果的 traversable 不再是 Map,所以 CanBuildFrom 隐含 参数用于为 结果对象。

在这个签名中我们有

  • Repr作为原始遍历容器的类型
  • B 作为包含值的目标类型,就像在简化签名中一样
  • That 作为目标容器的类型,由调用站点上隐含的具有正确类型的 CanBuildFrom 确定

【讨论】:

  • 你能解释一下为什么在第一个代码 sn-p 中类型 A 周围有括号吗?
  • @vkubicki 括号是可选的,在这种情况下。在其他情况下可能需要它们来消除歧义,例如如果你有一个接收元组的函数,((A, B)) => C
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多