2016-07-10 28 views
2

我剛纔看到List::map方法聲明,並被其併發症困惑。下面是它的外觀:如何理解scala中的List :: map聲明?

final override def map[B, That](f: A => B)(implicit bf: CanBuildFrom[List[A], B, That]): That = { 

嗯,我明白了什麼是implicit(據我得到的,基於特徵CanBuildFrom類型類將被自動編譯器引入,如果在範圍內)。但That在這裏應該是什麼意思?

我明白map(f: A => B)作爲一種函數的東西,它將每個函數f: A => B映射到相應的一元值List(A)List(B)之間的函數。所以我期望看到返回類型爲List[B]

順便說一句,這就是我們實際上在Option的情況下。

def map[B](f: A => B): Option[B] 

兩個ListOption的單子。 List的訣竅是什麼?

+0

相關:[斯卡拉2.8集合庫是一個「歷史上最長的遺書」的案例?](http://stackoverflow.com/questions/1722726/is-the-scala-2-8-collections-圖書館一個最長的自殺記事本) – stholzm

+2

'這只是一個類型參數。他們可以選擇'C'或'T',或者其他什麼。 ''那個'通常被選擇爲輸出類型的名稱,所以'this'變成'That'。 – jwvh

+0

@stella嘿,只是檢查這是否解決 – slouc

回答

2

你可以閱讀這些集合的架構here。我認爲它用於瞭解操作的正確返回類型。例如,當你在一個叫ListtoSet,一個隱含的CanBuildFrom[List[A], B, Seq[A]]必須在範圍......

3

映射的集合可以結果相同的集合(參數只與不同類型的)中,但它不必須就是這樣。它可以導致完全不同的收藏。例如,

val myMap = Map("firstName" -> "foo", "lastName" -> "bar") 
val result = myMap map (_._1.length) 

我們從Map[String, String]開始和結束了Iterable[Int]。這就是爲什麼Traversable s(注意Traversable是「抽象特質」,而TraversableLike是「實現特徵」)具有這種隱式生成器,稱爲CanBuildFromOption不是Traversable,並不需要所有此轉換機制 - 我們知道映射Option總是會產生Option

Traversable的行使map當,編譯器會發現在一個同伴對象CanBuildFrom類型的相應值(例如,here's一個爲列表)。如果沒有找到,它會上一層,等等。查看docs(找到「CanBuildFrom trait」頁面並從那裏開始)。