Scala映射显式类型

时间:2018-09-17 09:02:13

标签: scala generics higher-order-functions

我是Scala的新手,并且是一般编程人员。.我对Scala映射功能有麻烦。

map函数的简单签名为:def map [B](f:(A)⇒B):List [B]

所以我想map [B]的B是通用的,我可以显式设置结果的类型吗?

如果我尝试运行代码:

 val donuts1: Seq[Int] = Seq(1,2,3)
 val donuts2: List[Int] = {
    donuts1.map[Int](_ => 1)
  }

我收到错误消息“类型为int的表达式不符合扩展的类型B”

我不明白这里的问题。有人可以解释这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

问题中引用的map()签名是完整签名的简化/缩写版本。

final def map[B, That](f: (A) ⇒ B)(implicit bf: CanBuildFrom[List[A], B, That]): That

因此,如果要指定类型参数(几乎不需要),则必须同时指定两者。

val donuts1: List[Int] = List(1,2,3)
val donuts2: List[Int] = donuts1.map[Int,List[Int]](_ => 1)
//donuts2: List[Int] = List(1, 1, 1)
  

我可以显式设置结果的类型吗?

不是。类型参数必须与f函数/ lambda返回的内容一致。如果指定了type参数,那么(通常)您只是要求编译器确认结果类型实际上就是您认为的样子。