Я думаю, что это был бы более "Erlangish" метод, чтобы сделать это. По сути, вы должны создать список списков, который будет вашим результатом, и использовать два списка для управления этими списками, как очередь. Список «Головки» содержит списки, к которым вы будете добавлять следующие, а список «Хвостов» - те, к которым добавлены последние. Когда головы пустые, вы просто переворачиваете хвосты и используете их как новые головы. Перед возвратом результата вам нужно будет поменять местами все списки внутри Tails и Heads, а затем добавить Heads как есть к полностью измененным Tails. Извините за запутанные имена переменных, я думаю, что придумать несколько хороших имен для разбиения списков в программе Erlang - самая сложная часть;)
unzipflatten(NumberOfLists, List) when NumberOfLists > 0 ->
unzipflatten(List, lists:duplicate(NumberOfLists, []), []).
unzipflatten([], Heads, Tails) ->
[lists:reverse(L) || L <- lists:reverse(Tails, Heads)];
unzipflatten(L, [], Tails) ->
unzipflatten(L, lists:reverse(Tails), []);
unzipflatten([Elem | Rest], [Head | Tail], Tails) ->
unzipflatten(Rest, Tail, [[Elem | Head] | Tails]).
Также возможно выполнить фазу "распаковки" нерекурсивным способом, чтобы избежать списков: обратный шаг, но это более сложное решение. Примерно так:
unzipflatten(NumberOfLists, List) when NumberOfLists > 0 ->
unzipflatten({List, lists:duplicate(NumberOfLists, [])}).
unzipflatten({[], Heads}) ->
[lists:reverse(L) || L <- Heads];
unzipflatten({L, Heads}) ->
unzipflatten(unzipper({L, Heads})).
unzipper({[], Heads}) ->
{[], Heads};
unzipper({L, []}) ->
{L, []};
unzipper({[H | T], [Head | Tail]}) ->
{T1, Tail1} = unzipper({T, Tail}),
{T1, [[H | Head] | Tail1]}.