2013-11-09 321 views
4

是否有人可以解釋爲什麼後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 

由於是需要apply()的顯式調用。

回答

7

這是因爲map方法需要一秒鐘,implicit參數列表與CanBuildFrom隱含參數:

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

Scala編譯器解釋你的代碼,如果你想通過2在需要的隱含CanBuildFrom

CanBuildFrom和醜陋的方法簽名的使用是一個非常有爭議的Scala集合庫的元素,定期討論和批評。

這裏的另一個問題是Scala允許顯式傳遞隱式參數。我個人認爲不應該允許,然後我們可以避免許多類似於你的問題。但這當然是一個意見問題。