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 для различных типов кортежей (и их типов, что кажется сложным), и объединение их в более крупные кортежи должно обеспечить решение, удовлетворяющее ассоциативному закону, верно?

Ответы на вопрос(1)

Ваш ответ на вопрос