Scala: Kreuzprodukt (kartesisch) mit mehreren Quellen und heterogenen Typen

Ich versuche, mehrere Kreuzprodukte von Traversables verschiedener (aber jeweils homogener) Typen zu konstruieren. Der gewünschte Rückgabetyp ist eine Traversable eines Tupels, deren Typ mit den Typen in den Eingabe-Traversables übereinstimmt. Zum Beispiel:

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

Dies sollte eine gebenTraversable[(Int, String, Double)] mit allen möglichen Kombinationen aus den drei Quellen. Der Fall, nur zwei Quellen zu kombinieren, war schönhier geantwortet. Die gegebene Idee ist:

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

Die Kommentare dort erwähnen kurz das Problem weiterer Quellen, aber ich suche nach einer Lösung, die weder von Formlosigkeit noch von Skalaz abhängtTuple22). Was ich tun möchte, ist etwas wie das Folgende:

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

Dies funktioniert offensichtlich nicht aufgrund der Typlöschung (und würde im obigen Beispiel wahrscheinlich die Verwendung von Klammern erfordern, weilcross wäre richtig assoziativ).

Meine Frage ist: Ist es irgendwie möglich, die Reflexionsfunktionen von Scala 2.10 zu nutzen, um das Problem zu lösen? Im Allgemeinen passen beideA undX für die verschiedenen Tupeltypen (und ihre Typparameter, was schwierig zu sein scheint) und das Zusammenführen zu größeren Tupeln sollte eine Lösung liefern, die das Assoziativgesetz erfüllt, oder?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage