Каждый раз, когда я приблизился к уважаемому типу гуру о Emacs, они предупредят меня далеко. Большинству из них не нравился он, также. Я взял это в качестве подсказки.
OTOH, я интересовался TECO давным-давно (теперь, Вы знаете мой возраст), и я слышу, что Emacs вырос из этого. Так, я все еще задаюсь вопросом...
Я не верю, что можно сгенерировать список кортежей произвольного размера, но функция транспонирования делает именно то, что вам нужно, если вы не против получить список списков вместо этого.
Scala обрабатывает все свои кортежи разных размеров как разные классы ( Tuple1
, Tuple2
, Tuple3
, Tuple4
, ..., Tuple22
), хотя все они наследуются от черты Product
, эта черта не несет достаточно информации для фактического использования значений данных из разных размеров кортежей, если все они могут быть возвращены одной и той же функцией. (И дженерики scala также недостаточно мощны для обработки этого случая.)
Лучше всего написать перегрузки функции zip для всех 22 размеров кортежей. Генератор кода, вероятно, поможет вам в этом.
Я не верю, что это возможно без повторения. По одной простой причине: вы не можете определить тип возврата запрашиваемой функции.
Например, если ваш ввод был List (List (1,2), List (3,4))
, то тип возврата будет List [Tuple2 [Int]]
. Если бы у него было три элемента, тип возвращаемого значения был бы List [Tuple3 [Int]]
и т. Д.
Вы можете вернуть List [AnyRef]
или даже ] Перечислите [Продукт]
, а затем сделайте несколько наблюдений, по одному для каждого условия.
Что касается общей перестановки списка, это работает:
def transpose[T](l: List[List[T]]): List[List[T]] = l match {
case Nil => Nil
case Nil :: _ => Nil
case _ => (l map (_.head)) :: transpose(l map (_.tail))
}