gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:11:06 27 4
gpt4 key购买 nike

我想要以下功能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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com