【问题标题】:Scala - trouble with type inference in lambda expressionScala - lambda 表达式中的类型推断问题
【发布时间】:2014-11-25 07:40:17
【问题描述】:

尝试在 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 表达式也可以返回类型提示吗?

【问题讨论】:

    标签: scala lambda type-conversion


    【解决方案1】:

    我也多次遇到这个编译错误,但这不是类型推断问题。您提供了一个带有 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) =&gt; c: Boolean

    【讨论】:

    • 第二个sn-p使用模式匹配表达式来定义一个函数。这不是PartialFunction;这是一个Function1(它不是部分的,因为它是在其整个域中定义的)。 SLS 第 8.5 节指定模式匹配表达式根据上下文脱糖为 FunctionNPartialFunction。在这种情况下,由于 map 需要 Function1,所以就是这样。
    • 我只知道这一点,因为之前有人在 stackoverflow 上纠正过我,所以...继续传递它:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    相关资源
    最近更新 更多