Scala:将函数定义为正确的类型
发布时间:2020-12-16 18:26:02 所属栏目:安全 来源:网络整理
导读:我一直在玩 Scala代码,遇到了我不理解的编译器错误.代码生成Ints对的向量,然后尝试过滤它. val L = for (x - (1 to 5)) yield (x,x * x) val f = (x: Int,y: Int) = x 3println(L.filter(f)) 编译器抱怨尝试使用f作为过滤器方法的参数,编译器错误消息为: er
我一直在玩
Scala代码,遇到了我不理解的编译器错误.代码生成Ints对的向量,然后尝试过滤它.
val L = for (x <- (1 to 5)) yield (x,x * x) val f = (x: Int,y: Int) => x > 3 println(L.filter(f)) 编译器抱怨尝试使用f作为过滤器方法的参数,编译器错误消息为: 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’s type是IndexedSeq [Tuple2 [Int,Int]],因此filter需要一个Function1类型的函数[Tuple2 [Int,Int],Boolean].每个FunctionN [A,B,..,R] trait都有一个方法tupled,它返回一个Function1类型的函数[TupleN [A,..],R].您可以在此处使用它将f转换为L.filter所期望的类型.
println(L.filter(f.tupled)) > Vector((4,16),(5,25)) 或者,您可以将f重新定义为Function1 [Tuple2 [Int,Boolean],如下所示并直接使用它. val f = (t: (Int,Int)) => t._1 > 3 println(L.filter(f)) > Vector((4,25)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |