Один ответ на вопрос, упомянутый в комментариях , содержит полезную функцию crossJoin
, которая объединяет произвольное количество списков. Это моя слегка отредактированная версия:
def crossJoin[T](list: Traversable[Traversable[T]]): Traversable[Traversable[T]] =
list match {
case Nil => Nil
case x :: Nil => x map (Traversable(_))
case x :: xs =>
val xsJoin = crossJoin(xs)
for {
i <- x
j <- xsJoin
} yield {
Traversable(i) ++ j
}
}
Вам также нужен какой-то способ получения списка синонимов для слова:
def synonyms(String): List[String]
Тогда ваше решение просто
val words: List[String] = "5 centimeters".split("\\s+").toList
crossJoin(words.map(synonyms))
То есть замените каждое слово списком его синонимов, а затем перекрестно соедините результат.