Scala - lambda表达式中的类型推断问题

时间:2014-11-24 22:59:19

标签: scala lambda type-conversion

尝试在scala 2.11.0中编译下面的函数

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表达式的返回类型提示吗?

1 个答案:

答案 0 :(得分: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