如何在scala中编写元组范围函数?
发布时间:2020-12-16 19:20:05 所属栏目:安全 来源:网络整理
导读:我想要跟随功能 范围((1,1),(2,2))返回 Seq[(Int,Int)]((1,(1,2),2)) 它是一维范围的模拟,1到2 该函数应该适用于任何scala元组(即Tuple2,Tuple3,Tuple4,…)并且是类型安全的. 我试过了 def tupleRange[T : Product](t1:T,t2:T):Seq[T] = { assert(t1.product
我想要跟随功能
范围((1,1),(2,2))返回 Seq[(Int,Int)]((1,(1,2),2)) 它是一维范围的模拟,1到2 该函数应该适用于任何scala元组(即Tuple2,Tuple3,Tuple4,…)并且是类型安全的. 我试过了 def tupleRange[T <: Product](t1:T,t2:T):Seq[T] = { assert(t1.productArity == t2.productArity) def tail(t:Product):Product = sys.error("todo"); def join(i:Int,p:Product):T = sys.error("todo"); for( v <- t1.productElement(0).asInstanceOf[Int] to t2.productElement(0).asInstanceOf[Int]; v2 <- tupleRange(tail(t1),tail(t2))) yield join(v,v2) } implicit def range[T <:Product](p1:T) = new { def to(p2:T) = tupleRange(p1,p2)} 但我认为我选择了错误的方向. 解决方法
我建议@ziggystar在上面提出同样的建议.使用List [Int]而不是Ints的元组.
scala> import scalaz._ import scalaz._ scala> import Scalaz._ import Scalaz._ scala> def range(xs: List[Int],ys: List[Int]): List[List[Int]] = { | (xs,ys).zipped.map((x,y) => List.range(x,y + 1)).sequence | } range: (xs: List[Int],ys: List[Int])List[List[Int]] scala> range(List(1,2,4),List(2,5,6)) res29: List[List[Int]] = List(List(1,List(1,5),6),3,4,6)) 此实现假定xs和ys是有序的并且具有相同的长度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |