Как я могу исправить неправильный список в Erlang? - PullRequest
3 голосов
/ 21 января 2020

Я случайно сделал (эквивалент) следующего:

lists:foldl(fun(X, Acc) -> [X|Acc] end, 0, List).

Обратите внимание на начальное значение аккумулятора, которого нет в списке.

Это привело к неправильному списку. Это означает, что length, et c., Не работают с ним.

Учитывая, что мой "эквивалент" занял час, и я не хочу запускать его снова, как мне исправить мой неправильный список?

Для более простого примера неправильного списка и проблемы, которую он вызывает:

1> L = [1|[2|[3|4]]].
[1,2,3|4]
2> length(L).
** exception error: bad argument
     in function  length/1
        called as length([1,2,3|4])

Ответы [ 4 ]

1 голос
/ 23 января 2020

Если вы хотите сохранить «неправильный хвост», этого будет достаточно:

Fix = fun Fix([H | T]) -> [H | Fix(T)];
          Fix(T) -> [T]
      end.
0 голосов
/ 21 января 2020

Вот возможный подход:

Lister = fun L([], Acc)                -> lists:reverse(Acc);
             L([[_ | _] = H | T], Acc) -> L(T, [L(H, []) | Acc]);
             L([[] | T], Acc)          -> L(T, Acc);
             L([H | T], Acc)           -> L(T, [H | Acc]);
             L(X, Acc)                 -> L([], [X | Acc])
         end.

L = [[[1,[1|2]],1|2],1|[2|[3|4]]].

Lister(L, []).
% output [[[1,[1,2]],1,2],1,2,3,4]
0 голосов
/ 22 января 2020

вы должны использовать список для A CC

lists:foldl(fun(X, Acc) -> [X|Acc] end, 0, [1,2,3]).

result => [3,2,1 | 0], но если вы используете [0] для аргумента CC в списках: foldl / 3 функции, как показано ниже

lists:foldl(fun(X, Acc) -> [X|Acc] end, [0], [1,2,3]).

результат => [3,2,1,0]

0 голосов
/ 21 января 2020

В простом случае, который у меня был, с не вложенным неподходящим списком, где я не хочу лишний элемент (потому что он должен был быть пустым списком и ничего не значить), он сделает это:

Fix = fun F([H|T], A) when is_list(T) -> F(T, [H|A]);
          F([H|_], A) -> F([], [H|A]);
          F([], A) -> lists:reverse(A)
      end.
Fix(L, []).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...