Scala: produkt krzyżowy (kartezjański) z wieloma źródłami i heterogenicznymi typami

Usiłuję skonstruować wiele produktów krzyżowych traversables różnych (ale każdy jednorodnych) typów. Żądany typ powrotu to przechodząca krotka z typem pasującym do typów w wejściowych trasach. Na przykład:

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

To powinno daćTraversable[(Int, String, Double)] ze wszystkimi możliwymi kombinacjami z trzech źródeł. Sprawa łączenia tylko dwóch źródeł była przyjemnaodpowiedział tutaj. Podany pomysł to:

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

W komentarzach krótko wspomina się o problemie większej liczby źródeł, ale szukam rozwiązania, które nie zależy ani od bezkształtnych, ani od skalazów (z drugiej strony, nie mam nic przeciwko posiadaniu jakiegoś wzoru do skalowania doTuple22). Chciałbym zrobić coś takiego:

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

To oczywiście nie działa z powodu kasowania typu (i niestety prawdopodobnie wymagałoby użycia nawiasów w powyższym przykładzie, ponieważcross byłoby dobrze stowarzyszone).

Moje pytanie brzmi: czy możliwe jest wykorzystanie funkcji odbicia Scala 2.10 w celu rozwiązania problemu? Ogólnie rzecz biorąc, dopasowanie obuA iX do różnych typów krotek (i ich parametrów typu, które wydają się trudne) i połączenie ich w większe krotki powinno dostarczyć rozwiązania spełniającego prawo asocjacyjne, prawda?

questionAnswers(1)

yourAnswerToTheQuestion