Как разделить список кортежей на кортежи списков? - PullRequest
1 голос
/ 05 июня 2019

Меня попросили разделить список кортежей на кортеж с двумя списками следующим образом:

splitter ([{1,2},{3,4},{5,6}]). = {[1,3,5],[2,4,6]}

Я пытался написать следующий код:

splitter([]) -> {[],[]};
splitter(L) ->(map (fun ({A, _}) -> A end, L))|(map (fun ({_, B}) -> B end, L)).

И он не компилируется, я получаю ошибку: синтаксическая ошибка перед: '|'

в чем проблема?:

Ответы [ 2 ]

3 голосов
/ 05 июня 2019

Вам не хватает внешних фигурных скобок.Также замените | на ,, так как это то, что используется для разделения членов кортежа.

splitter([]) -> {[],[]};
splitter(L) -> {(map (fun ({A, _}) -> A end, L)),
                (map (fun ({_, B}) -> B end, L))
               }.
1 голос
/ 11 июня 2019

Пустой список не нужен. Вы также можете использовать списочные выражения.

splitter(L) -> {[ X || {X, _} <- L], [X || {_, X} <- L]}.

Можно сделать и универсальный

splitter_n(L) ->
    list_to_tuple(transpose([tuple_to_list(X) || X <- L])).

transpose([]) -> [];
transpose([[]|_]) -> [];
transpose(L) ->
    [[hd(X) || X <- L] | transpose([tl(X) || X <- L])].

В работе

1> c(splitter).
{ok,splitter}
2> splitter:splitter_n([{1,2},{3,4},{5,6}]).
{[1,3,5],[2,4,6]}
3> splitter:splitter_n([{1,2,3},{4,5,6},{7,8,9}]).
{[1,4,7],[2,5,8],[3,6,9]}
...