Вот один из способов решения вашего примера, но это не для произвольного числа последовательностей.
val ints = List(1,2,3)
val chars = List('a', 'b', 'c')
val strings = List("Alpha", "Beta", "Gamma")
val bools = List(true, false, false)
val input = ints zip chars zip strings zip bools
// Flattens a tuple ((A,B),C) into (A,B,C)
def f2[A,B,C](t: ((A,B),C)) = (t._1._1, t._1._2, t._2)
// Flattens a tuple ((A,B),C,D) into (A,B,C,D)
def f3[A,B,C,D](t: ((A,B),C,D)) = (t._1._1, t._1._2, t._2, t._3)
input map f2 map f3
Я не думаю, что это возможно сделать в общем случае для кортежей произвольной длины, по крайней мере, с помощью такого решения. Кортежи строго типизированы, и система типов, насколько мне известно, не позволяет указывать переменное число параметров типа, что делает невозможным создание обобщенной версии f2
и f3
, которая требует кортеж произвольной длины ((A,B),C,D,...)
(который возвращает кортеж (A,B,C,D,...)
).
Если бы был способ указать переменное число параметров типа, нам бы не понадобились черты Tuple1
, Tuple2
, ... Tuple22
в стандартной библиотеке Scala.