Scala列表索引

Nab*_*egh 4 collections scala

有人可以解释为什么需要明确的呼叫apply()map()

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
Run Code Online (Sandbox Code Playgroud)

谢谢.

ghi*_*hik 7

那是因为map方法采用implicitCanBuildFrom隐式参数的第二个参数列表:

def map[B, That](f: (A) ? B)(implicit bf: CanBuildFrom[List[A], B, That]): That
Run Code Online (Sandbox Code Playgroud)

Scala编译器会解释您的代码,就像您尝试传递需要2隐式的CanBuildFrom位置一样.

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

这里的另一个问题是Scala允许显式传递隐式参数.我个人认为它不应该被允许,然后我们可以避免许多类似于你的问题.但这当然是一个意见问题.