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

如何在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是有序的并且具有相同的长度.

(编辑:李大同)

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

    推荐文章
      热点阅读