Scala: перекрестное (декартово) произведение с несколькими источниками и разнородными типами
Я пытаюсь построить несколько перекрестных произведений различных типов (но каждый однородный). Желаемый тип возвращаемого значения - это обход кортежа с типом, совпадающим с типами во входных обходных путях. Например:
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)
}
Комментарии там кратко упоминают проблему большего количества источников, но я ищу, чтобы найти решение, которое не зависит ни от бесформенного, ни от скаляша (с другой стороны, я не против иметь некоторый шаблон для масштабирования до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
для различных типов кортежей (и их типов, что кажется сложным), и объединение их в более крупные кортежи должно обеспечить решение, удовлетворяющее ассоциативному закону, верно?