scala - 如何在scala中编写元组范围函数?

标签 scala tuples scala-collections

我想要以下功能range((1,1), (2,2))哪个返回

Seq[(Int,Int)]((1,1),(1,2),(2,1),(2,2))

它与 1 to 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]而不是 Int 的元组s。

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, 2, 4), List(1, 2, 5), List(1, 2, 6), 
List(1, 3, 4), List(1, 3, 5), List(1, 3, 6), List(1, 4, 4), List(1, 4, 5), 
List(1, 4, 6), List(1, 5, 4), List(1, 5, 5), List(1, 5, 6), List(2, 2, 4), 
List(2, 2, 5), List(2, 2, 6), List(2, 3, 4), List(2, 3, 5), List(2, 3, 6), 
List(2, 4, 4), List(2, 4, 5), List(2, 4, 6), List(2, 5, 4), List(2, 5, 5), 
List(2, 5, 6))

此实现假设 xsys订购并具有相同的长度。

关于scala - 如何在scala中编写元组范围函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7634474/

相关文章:

python - 打印索引为 [ :1] works, 但 [0] 的元组会产生 TypeError

scala - 重构一个小型 Scala 函数

scala - Scala 3 中的宏注释

c++ - 如何找到元组 vector 中的最大值?

python - 一个元组的列表,其中包含多个项目

scala - 尽管是包装器,但 CollectionConverters 的性能代价高昂?

scala - 为什么 val range = Range(1, 2, 3, 4) 会出错?

scala - 如何使方法返回与输入相同的泛型?

scala - 使用 Databinders 调度库在 Scala 中设置 User-Agent header

scala - 关于如何以编程方式从 json 文件开始创建自定义 org.apache.spark.sql.types.StructType 架构对象