Декартово произведение и карта объединены в Scala

Это продолжение: Расширение набора наборов строк в декартово произведение в Scala

Идея состоит в том, что вы хотите взять:

val sets = Set(Set("a","b","c"), Set("1","2"), Set("S","T"))

и вернуться:

Set("a&1&S", "a&1&T", "a&2&S", ..., "c&2&T")

Общее решение:

def combine[A](f:(A, A) => A)(xs:Iterable[Iterable[A]]) =
    xs.reduceLeft { (x, y) => x.view.flatMap {a => y.map(f(a, _)) } } 

используется следующим образом:

val expanded = combine{(x:String, y:String) => x + "&" + y}(sets).toSet

Теоретически должен быть способ принимать входные данные типа Установите [Set [A]] и получите обратно Set [B] . То есть, чтобы преобразовать тип при объединении элементов.

Пример использования: в наборах строк (как указано выше) и вывести длины их конкатенации. Функция f в комбинировать могла бы иметь вид:

(a:Int, b:String) => a + b.length 

Я не смог придумать реализацию. У кого-нибудь есть ответ?

6
задан Community 23 May 2017 в 12:10
поделиться