2012-01-10 139 views
5

我正在採取我的第一個有趣的步驟(非hello-世界水平)與斯卡拉(2.9.1),我卡住試圖瞭解一個非信息錯誤消息。 它去喜歡這個:斯卡拉不匹配地圖

error: type mismatch; 
found : (Int, Array[InputEntry]) => (Int, Double) 
required: (Int, Array[InputEntry]) => ? 
entries.groupBy(grouper).map((k: Int, ies: Array[InputEntry]) => (k, doMyStuff(ies))) 

如該片段被認爲是其中一些處理的推移,你可以猜測的過程,它實際上是用簽名Array[InputEntry] => Double明確定義的功能。

石斑魚的簽名是Array[InputEntry] => Int

我試圖提取和替換功能的拉姆達,但它是無用的,和我被困試圖理解錯誤的問號......

任何想法?

編輯:我應該澄清一點,InputEntry是我定義的類,但爲了這個例子,在我看來,它幾乎沒有關係。

+0

我們需要看一些代碼。用錯誤消息打印的代碼部分是不夠的。特別是,'doMyStuff'的類型簽名是什麼,你試圖將結果寫入什麼樣的變量? – 2012-01-11 00:10:23

+0

你確定錯誤信息沒有說'required:((Int,List [InputEntry]))=>? – 2012-01-11 00:23:40

+0

我想我應該使它更具體一點是條目是一個Map。無論如何感謝 – em70 2012-01-11 07:07:54

回答

12

這看起來像問題:

.map((k: Int, ies: Array[InputEntry]) => (k, doMyStuff(ies))) 

你需要使用一個case語句來取消應用PARAMS並將其分配給本地變量。您還需要使用{}而不是(),因爲它現在是一個匿名函數。

entries.groupBy(grouper).map{case (k, ies) => (k, doMyStuff(ies))} 

下面是一個更簡單的例子。

scala> val x = List(("a",1),("b",2)) 
x: List[(java.lang.String, Int)] = List((a,1), (b,2)) 
scala> x.map{ case (str, num) => num } 
res5: List[Int] = List(1, 2) 

如果您不想使用case語句,則必須將該元組保存爲單個變量。

scala> x.map(tuple => tuple._2) 
res6: List[Int] = List(1, 2) 
+0

-1:代碼的那部分是正確的。 – 2012-01-11 00:19:39

+0

哎呦我錯了:他報錯了錯誤信息。一旦你解釋了這一點,我應該實際上給+1。 – 2012-01-11 00:21:46

+1

相應的bug被標記爲固定的,所以它不應該在下一個版本中出現:https://issues.scala-lang.org/browse/SI-5067 – 2012-01-11 00:54:57