yur*_*ura 7 scala tuples scala-collections
我想要跟随range((1,1), (2,2))
返回的功能
Seq[(Int,Int)]((1,1),(1,2),(2,1),(2,2))
Run Code Online (Sandbox Code Playgroud)
它是一维范围的模拟 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)}
Run Code Online (Sandbox Code Playgroud)
但我认为我选择了错误的方向.
我建议@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))
Run Code Online (Sandbox Code Playgroud)
此实现假设xs
并且ys
是有序且具有相同的长度.