我一直在玩 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]
类型的函数.您可以在这里使用它来转换 f
到 L.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/