2013-08-30 67 views
2

此代碼適用於整數的列表的功能,並設置每個值在選項的列表具有值4:斯卡拉地圖功能簽名的說明?

val l = List(1,2,3,4,5)       //> l : List[Int] = 
    val v = 4          //> v : Int = 4 
    def g(v:Int) = List(v-1, v, v+1)    //> g: (v: Int)List[Int] 
l map (x => {f(x);})       //> res0: List[Option[Int]] = List(Some(4), Some(4), Some(4), Some(4), Some(4)) 

地圖的簽名:

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

由於B是第一類型的參數(在地圖[B,That])這是否意味着它的類型爲前綴操作數'l'(List)?

'A'是怎麼輸入的? Scala編譯器是否會檢查List'l'中的類型並推斷出它的類型爲Int?

'那'是怎麼輸入的?

+0

[Scala 2.8 breakout]的可能重複(http://stackoverflow.com/questions/1715681/scala-2-8-breakout) – senia

+0

在你的代碼中,函數f是什麼?函數g的用法是什麼?如果您查看List的API文檔,您可以看到該映射具有以下簽名:def map [B](f:(A)⇒B):List [B]:它僅轉換列表中的A列表的B – bhericher

+2

請參閱**關於'[這個答案](http://stackoverflow.com/a/1716558/406435)中的'CanBuildFrom' **部分[Daniel C. Sobral](http://stackoverflow.com/users/53013 /丹尼爾-C-索布拉爾)。 – senia

回答

7

用於mapList[A]簡單簽名是

def map[B](f: (A) ⇒ B): List[B] 

這意味着

  • A由實際列表
    • Int爲示例列表l類型參數確定
  • B由作爲參數
    • Option[Int]被傳爲例如函數的函數f的目標類型確定f: Int -> Option[Int]

膨脹簽名是

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That 

其存在,所以您可以一般地在可以遍歷的容器之間進行映射在某種程度上,即使目標可穿越具有與原始不同的形式。

具體例子遍歷Map作爲Pairs, 與產生單個值的映射函數的容器。由此產生的 可以不再是Map,因此CanBuildFrom隱含的 參數用於查找生成對象的「可用表示」。

在該簽名,我們有

  • Repr作爲原始遍歷容器
  • B作爲包含的值的目標類型的類型,如在簡化簽名
  • That作爲目標容器的類型,由隱含存在的CanBuildFrom決定,在呼叫站點有正確的類型