em7*_*m70 5 types scala type-inference compiler-errors
我正在使用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)))
Run Code Online (Sandbox Code Playgroud)
正如你可以猜到的,这个片段中的进程应该是某些处理继续进行的,并且它实际上是一个带有签名的定义良好的函数Array[InputEntry] => Double.
相反,石斑鱼的签名是Array[InputEntry] => Int.
我试图提取一个函数并替换lambda但它没用,而且我试图理解错误中的问号...
有任何想法吗?
编辑:我应该澄清一下,InputEntry是我定义的一个类,但是为了这个例子,在我看来它似乎并不相关.
tom*_*eng 14
这看起来像问题:
.map((k: Int, ies: Array[InputEntry]) => (k, doMyStuff(ies)))
Run Code Online (Sandbox Code Playgroud)
您需要使用case语句来取消应用params并将它们分配给局部变量.您还需要使用{}而不是(),因为它现在是一个匿名函数.
entries.groupBy(grouper).map{case (k, ies) => (k, doMyStuff(ies))}
Run Code Online (Sandbox Code Playgroud)
这是一个更简单的例子.
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)
Run Code Online (Sandbox Code Playgroud)
如果您不想使用case语句,则必须将元组保留为单个变量.
scala> x.map(tuple => tuple._2)
res6: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)