我正在尝试构建不同(但每个同质)类型的可遍历的多个交叉产品。所需的返回类型是元组的可遍历,其类型与输入可遍历中的类型匹配。例如:
List(1, 2, 3) cross Seq("a", "b") cross Set(0.5, 7.3)
这应该给出Traversable[(Int, String, Double)]
来自三个来源的所有可能组合。仅结合两个来源的情况在这里得到了很好的回答。给定的想法是:
implicit class Crossable[X](xs: Traversable[X]) {
def cross[A](ys: Traversable[A]) = for { x <- xs; y <- ys } yield (x, y)
}
那里的评论简要提到了更多来源的问题,但我正在寻找一个不依赖于 shapeless 或 scalaz 的解决方案(另一方面,我不介意有一些样板文件可以扩展到Tuple22
)。我想做的是如下所示:
implicit class Crossable[X](xs: Traversable[X]) {
def cross[A](ys: Traversable[A]) = for { x <- xs; y <- ys } yield (x, y)
def cross[A,B](ys: Traversable[(A,B)]) = // ... extend all Tuple2's in ys with x in xs to Tuple3's
def cross[A,B,C](ys: Traversable[(A,B,C)]) = // ...
// ...
}
由于类型擦除,这显然不起作用(不幸的是,可能需要在上面的示例中使用括号,因为cross
它是右关联的)。
我的问题是:是否有可能利用 Scala 2.10 的反射特性来解决问题?一般来说,匹配A
各种X
元组类型(及其类型参数,这似乎具有挑战性)并将它们合并到更大的元组应该提供满足关联法则的解决方案,对吧?