Scala 列表索引

标签 scala collections

有人可以解释一下为什么在map()之后需要显式调用apply()

scala> val l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)

scala> l(2)
res56: Int = 3

scala> l.map(x => x*2)
res57: List[Int] = List(2, 4, 6)

scala> l.map(x => x*2)(2)
<console>:9: error: type mismatch;
 found   : Int(2)
 required: scala.collection.generic.CanBuildFrom[List[Int],Int,?]
              l.map(x => x*2)(2)
                              ^

scala> l.map(x => x*2).apply(2)
res59: Int = 6

谢谢。

最佳答案

这是因为 map 方法采用第二个隐式参数列表,其中包含 CanBuildFrom 隐式参数:

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

Scala 编译器会解释您的代码,就像您尝试传递需要隐式 CanBuildFrom2 一样。

CanBuildFrom 的使用以及随之而来的丑陋方法签名是 Scala 集合库中一个非常有争议的元素,经常受到讨论和批评。

这里的另一个问题是 Scala 允许显式传递隐式参数。我个人认为这是不应该允许的,这样我们就可以避免许多与您类似的问题。但这当然是一个观点问题。

关于Scala 列表索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19879636/

相关文章:

java - 从 Spark 中的类别列表创建一个热编码 vector

java - 将数据库表的结果解析为通用集合

Java:排序队列

c# - asp.net datalist 数据绑定(bind)

java - SBT 在 jar 中包含一个二进制文件

algorithm - 霍夫曼解码(在 Scala 中)

scala - 如何在隐式方法中引用 "this"

scala - 如何在scala中反转 map ?

java - Streams API::如何从 LIST<Object> 修改自定义对象的变量?

Java 哈希集合