我正在使用Scala(2.9.1)迈出我的第一个有趣步骤(非Hello World级别),而我一直试图理解一个非常无意义的错误消息。
它非常像这样:

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

我试图提取一个函数并替换lambda,但是它没有用,而且我一直试图理解错误中的问号...

有任何想法吗?

编辑:我应该澄清一下InputEntry是我定义的一个类,但是对于这个示例,在我看来,它似乎几乎没有关系。

最佳答案

这看起来像问题:

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

您需要使用case语句取消应用参数,并将其分配给局部变量。您还需要使用{}代替(),因为它现在是一个匿名函数。
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)

10-06 11:12