加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读