Декартово произведение двух списков

Дана карта, где цифра связана с несколькими символами

scala> val conversion = Map("0" -> List("A", "B"), "1" -> List("C", "D"))
conversion: scala.collection.immutable.Map[java.lang.String,List[java.lang.String]] =
  Map(0 -> List(A, B), 1 -> List(C, D))

Я хочу сгенерировать все возможные последовательности символов на основе последовательности цифр. Примеры:

"00" -> List("AA", "AB", "BA", "BB")
"01" -> List("AC", "AD", "BC", "BD")

Я могу сделать это для понимания

scala> val number = "011"
number: java.lang.String = 011

Создать последовательность возможных символов по индексу

scala> val values = number map { case c => conversion(c.toString) }
values: scala.collection.immutable.IndexedSeq[List[java.lang.String]] =
  Vector(List(A, B), List(C, D), List(C, D))

Сгенерировать все возможные последовательности символов

scala> for {
     | a <- values(0)
     | b <- values(1)
     | c <- values(2)
     | } yield a+b+c
res13: List[java.lang.String] = List(ACC, ACD, ADC, ADD, BCC, BCD, BDC, BDD)

Здесь все становится некрасиво, и это будет работать только для последовательностей из трех цифр. Есть ли способ достичь того же результата для любой длины последовательности?

17
задан Mark Jayxcela 23 November 2011 в 18:29
поделиться