Scala列表索引

Scala列表索引,scala,collections,Scala,Collections,有人能解释一下为什么在map()之后需要显式调用apply() scala>vall=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) :9:错误:类型不匹配; 发现:Int(2) 必需:scala.collection.generic.CanBuildFrom[List[Int],Int

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

scala>vall=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)
:9:错误:类型不匹配;
发现:Int(2)
必需:scala.collection.generic.CanBuildFrom[List[Int],Int,?]
l、 映射(x=>x*2)(2)
^
scala>l.map(x=>x*2).apply(2)
res59:Int=6

谢谢。

这是因为
map
方法需要一秒钟,
implicit
参数列表带有
CanBuildFrom
隐式参数:

def map[B, That](f: (A) ⇒ B)(implicit bf: CanBuildFrom[List[A], B, That]): That
Scala编译器将您的代码解释为您试图传递
2
,其中隐式
CanBuildFrom
是必需的

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

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

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