2014-11-24 70 views
1

试图编译下面的函数在阶2.11.0Scala的 - 与类型推断麻烦lambda表达式

def dafuq(canvas: Array[Array[Boolean]]): Array[Array[Boolean]] = { 
     for (r <- canvas.reverse) yield r.zipWithIndex.map((c: Boolean, i: Int) => c) 
} 

产生

Solution.scala:6: error: type mismatch; 
    found : (Boolean, Int) => Boolean 
    required: ((Boolean, Int)) => ? 
     for (r <- canvas.reverse) yield r.zipWithIndex.map((c: Boolean, i: Int) => c) 
                       ^

功能是假的,但它示出了我有一个问题遇到。我对Scala很陌生,所以这可能是一个新手的错误,但我找不到解决方案或解释这个问题。你知道是什么原因导致上述行为?

也是返回类型暗示可能的lambda表达式?

回答

3

我也遇到过很多次这个编译错误,但它不是一个类型推断问题。你提供了一个具有2个参数的匿名函数,但编译器期望一个具有单个元组参数的函数。 2个解决方案:

def dafuq(canvas: Array[Array[Boolean]]): Array[Array[Boolean]] = { 
     for (r <- canvas.reverse) yield r.zipWithIndex.map(ci => ci._1) 
} 

def dafuq(canvas: Array[Array[Boolean]]): Array[Array[Boolean]] = { 
     for (r <- canvas.reverse) yield r.zipWithIndex.map { case (c, i) => c } 
} 

在第一溶液ci推断到一对(Boolean, Int)。在第二种解决方案中,我们使用模式匹配表达式。

也是返回类型暗示可能的lambda表达式?

我不知道,但您可以在任何表达式上添加类型注释。例如:case (c, i) => c: Boolean

+3

第二个片段使用模式匹配表达式来定义函数。它不是'部分功能';它是一个'Function1'(它不是部分的,因为它是在整个域中定义的)。 [SLS](http://www.scala-lang.org/docu/files/ScalaReference.pdf)第8.5节指定根据上下文,模式匹配表达式可以解析为“FunctionN”或“PartialFunction”。在这种情况下,由于'map'需要一个'Function1',就是这样。 – 2014-11-24 23:30:29

+0

你说得对,我要编辑答案。 :) – Dimitri 2014-11-24 23:37:46

+0

我只知道这个,因为其他人已经纠正了我的计算器之前,所以...继续传递它:) – 2014-11-24 23:44:24