Причины списков: flatten у вас не работает, потому что строки в Erlang - это просто списки маленьких целых чисел. Мы можем справиться с этим с помощью функции, которая перестает повторяться во вложенном списке, если список является просто строкой.
Для произвольно вложенного списка строк вы можете использовать следующую функцию:
slab([]) ->
[];
slab([F|R]) ->
case io_lib:char_list(F) of
true -> [F|slab(R)];
false -> slab(F) ++ slab(R)
end.
Он использует io_lib: char_list (), чтобы решить, была ли вложенная рекурсия достаточно глубокой.
Пример операции:
1> slab([[["foo", "bar"], "baz", [[[["foobar"]]]], "froboz", "the end"]]).
["foo","bar","baz","foobar","froboz","the end"]
2>
Небольшое улучшение, которое позволило бы использовать смешанные вложенные списки:
slab([]) ->
[];
slab([F|R]) when is_list(F) ->
case io_lib:char_list(F) of
true -> [F|slab(R)];
false -> slab(F) ++ slab(R)
end;
slab([F|R]) ->
[F|slab(R)].
Это ведет себя так же, как списки: сгладить, за исключением того, что обрабатывает строку, как если бы они не были списками:
1> slab([[["foo", "bar"], "baz", [[[["foobar", atom]],[a,b,c]]], 2, "froboz", "the end"]]).
["foo","bar","baz","foobar",atom,a,b,c,2,"froboz","the end"]