Вот мое решение данной проблемы. Обратите внимание, что лень просто вызвана использованием .view
в «корневой коллекции», используемой для понимания.
scala> def combine[A](xs: Traversable[Traversable[A]]): Seq[Seq[A]] =
| xs.foldLeft(Seq(Seq.empty[A])){
| (x, y) => for (a <- x.view; b <- y) yield a :+ b }
combine: [A](xs: Traversable[Traversable[A]])Seq[Seq[A]]
scala> combine(Set(Set("a","b","c"), Set("1","2"), Set("S","T"))) foreach (println(_))
List(a, 1, S)
List(a, 1, T)
List(a, 2, S)
List(a, 2, T)
List(b, 1, S)
List(b, 1, T)
List(b, 2, S)
List(b, 2, T)
List(c, 1, S)
List(c, 1, T)
List(c, 2, S)
List(c, 2, T)
Чтобы получить это, я начал с функции combine
, определенной в https://stackoverflow.com/a/4515071/53974,, передав ей функцию (a, b) => (a, b)
. Однако это не совсем работало напрямую, так как этот код ожидает функцию типа (A, A) => A
. Поэтому я просто немного адаптировал код.