我是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”
我不明白这里的问题。有人可以解释这个问题吗?
谢谢!
答案 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参数,那么(通常)您只是要求编译器确认结果类型实际上就是您认为的样子。