2013-10-28 29 views
3

我有地圖:傳遞地圖爲(flatMap)映射功能將導致錯誤

val mnem = Map(
    '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL", 
    '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ") 

我很好奇,爲什麼我不能通過此圖作爲映射函數考慮到一個地圖既是收集和功能如下面

val digits = "2345"      //> digits : String = 2345 

digits flatMap mnem      //> ERROR 

但我能做到這一點

digits flatMap(mnem(_))     //> res0: String = ABCDEFGHIJKL 

我試圖做一些類似於此:

digits map mnem       //> res1: scala.collection.immutable.IndexedSeq[String] = Vector(ABC, DEF, GHI, 
               //| JKL)  

回答

4

Map[Char, String]是一個功能(Char => String)

trait Map[A, +B] extends ... MapLike[A, B, Map[A, B]] 
trait MapLike[A, +B, ...] extends PartialFunction[A, B] ... 
trait PartialFunction[-A, +B] extends (A) ⇒ B 

這工作得很好:

val f: Char => String = mnem 

您將與digits flatMap f得到同樣的錯誤。

flatMapString需要Char ⇒ GenTraversableOnce[B]作爲參數。並且String不是GenTraversableOnce,所以(Char => String)(和Map[Char, String])不是Char ⇒ GenTraversableOnce[B]

斯卡拉重寫Map.applyMap(_)x => Map(x)然後適用的隱式轉換運作結果:

x => augmentString(Map(x)) 

它可以轉換Map(x)得到Char ⇒ GenTraversableOnce[Char]類型的功能,但它不能轉換的現有功能鍵入Char => StringChar ⇒ GenTraversableOnce[Char],因爲沒有這種隱式轉換是範圍。

-1

因爲Map不是功能,而地圖的對象可以如Map定義的方法由於apply方法起作用。 flatMap需要一個函數(而不是一個方法),這就是爲什麼你需要使用mnem(_)將其轉換爲函數。

+1

這是非常翔實的。任何想法爲什麼flatMap是這樣設計的? – Chad

+2

'Map'是一個函數。你的回答是不正確的。看到我的答案。 – senia

3

要得到行相當於

digits flatMap(mnem(_)) // mnem's apply method is the actual method passed to flatMap 

你想

digits flatMap mnem.apply