Scala:将函数定义为正确的类型

标签 scala

我一直在玩 Scala 代码,但遇到了一个我不明白的编译器错误。该代码生成一个 Int 对向量,然后尝试对其进行过滤。

val L = for (x <- (1 to 5)) yield (x, x * x) 
val f = (x: Int, y: Int) => x > 3
println(L.filter(f))

编译器提示试图使用 f作为 filter 的论据带有编译器错误消息的方法是:
error: type mismatch;
found   : (Int, Int) => Boolean
required: ((Int, Int)) => Boolean

我如何定义函数 f正确地满足所需的功能类型?我试图在 (x: Int, y: Int) 周围添加额外的括号但这给了:
error: not a legal formal parameter
   val f = ((x: Int, y: Int)) => x > 3
            ^

最佳答案

f有类型 Function2[Int, Int, Boolean] . L的类型是 IndexedSeq[Tuple2[Int, Int]]等等 filter期望类型为 Function1[Tuple2[Int, Int], Boolean] 的函数.每FunctionN[A, B, .., R] trait 有一个方法 tupled ,它返回一个 Function1[TupleN[A, B, ..], R] 类型的函数.您可以在这里使用它来转换 fL.filter 预期的类型.

println(L.filter(f.tupled))
> Vector((4,16), (5,25))

或者,您可以重新定义 f成为 Function1[Tuple2[Int, Int], Boolean]如下,直接使用。
val f = (t: (Int, Int)) => t._1 > 3
println(L.filter(f))
> Vector((4,16), (5,25))

关于Scala:将函数定义为正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8137522/

相关文章:

scala - 如何更改 SBT 为 Maven 存储库生成 URL 的规则?

scala - 为什么 Scala 2.11 和 Spark with scallop 会导致 "java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror"?

Scala,P08 - 包

scala - 隐式转换、类型参数、重载和匿名函数语法

Scala 伴生对象不是单例

scala - Spark – 连接第一行匹配条件

Scala警告删除以防万一

scala - 在 Scala DSL 中创建控制结构,而无需对换行符进行有趣的限制

scala - 在 Spark 和 Scala 中创建数据集时出现问题

scala - 如何在 Scala 中构建合适的命名空间?