Scala: produto cruzado (cartesiano) com múltiplas fontes e tipos heterogêneos

Eu estou tentando construir vários produtos cruzados de travessias de tipos diferentes (mas cada homogêneo). O tipo de retorno desejado é um percorrível de uma tupla com o tipo correspondente aos tipos nas travessias de entrada. Por exemplo:

List(1, 2, 3) cross Seq("a", "b") cross Set(0.5, 7.3)

Isso deve dar umTraversable[(Int, String, Double)] com todas as combinações possíveis das três fontes. O caso de combinar apenas duas fontes foi bemrespondeu aqui. A ideia dada é:

implicit class Crossable[X](xs: Traversable[X]) {
  def cross[A](ys: Traversable[A]) = for { x <- xs; y <- ys } yield (x, y)
}

Os comentários lá mencionam brevemente o problema de mais fontes, mas eu estou olhando para encontrar uma solução que não dependa de qualquer disforme ou scalaz (por outro lado, não me importo de ter algum clichê para escalar atéTuple22). O que eu gostaria de fazer é algo como o seguinte:

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)]) = // ...
  // ...
}

Obviamente, isso não funciona devido ao tipo de apagamento (e, infelizmente, provavelmente exigiria o uso de parênteses no exemplo acima, porquecross seria certo associativo).

Minha pergunta é: É possível explorar os recursos de reflexão do Scala 2.10 para resolver o problema? Em geral, combinando ambosA eX para os vários tipos de tupla (e seus parâmetros de tipo, o que parece desafiador) e mesclá-los a tuplas maiores devem fornecer uma solução que satisfaça a lei associativa, certo?

questionAnswers(1)

yourAnswerToTheQuestion