從另一個問題,我問繼,Scala 2.8 breakout,我想了解更多的關於Scala的方法TraversableLike[A].map
其簽名如下:斯卡拉2.8 CanBuildFrom
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
注意的幾件事情有關此方法:
- 它需要一個函數將遍歷中的每個
A
轉換爲B
。 - 它返回
That
並採用CanBuildFrom[Repr, B, That]
類型的隱式參數。
我可以調用這個如下:
> val s: Set[Int] = List("Paris", "London").map(_.length)
s: Set[Int] Set(5,6)
什麼我不能很好地領會是怎樣的事實That
是勢必到B
(即,它是B的部分集合)正在被編譯器強制執行。該類型的參數看起來是獨立的上方和性狀CanBuildFrom
本身的簽名的簽名:
trait CanBuildFrom[-From, -Elem, +To]
如何Scala編譯器確保That
不能被迫到一些東西,沒有意義?
> val s: Set[String] = List("Paris", "London").map(_.length) //will not compile
編譯器如何決定什麼隱含CanBuildFrom
對象範圍的電話嗎?
這裏是後一個相當不錯的解釋http://blog.bruchez.name/2012/08/getting-to-know-canbuildfrom-without-phd.html – 2012-08-23 21:33:26
爲了記錄在案,這種用法有概念名稱:返回類型多態。 – lcn 2015-03-07 20:18:45