gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:20:15 25 4
gpt4 key购买 nike

我一直在玩 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com