concatenate / 1, как определено в книге, работает как функция выравнивания, которая выравнивает только один уровень. ([[1],[2]]
становится [1,2]
, [[[1]],[[2]]]
становится [[1],[2]]
и т. Д.) Стратегия, предложенная в подсказке, состоит в том, чтобы полностью сгладить не путем определения новой логики в flatten / 1, а с использованием concatenate / 1 в рекурсивном flatten / 1 вызовов.
concatenate(Ls) ->
reverse(concatenate(Ls, [])).
concatenate([], Acc) ->
Acc;
concatenate([[]|Rest], Acc) ->
concatenate(Rest, Acc);
concatenate([[H|T]|Rest], Acc) ->
concatenate([T|Rest], [H|Acc]);
concatenate([H|T], Acc) ->
concatenate(T, [H|Acc]).
flatten(L) ->
flatten(L, []).
flatten([], Acc) ->
Acc;
flatten(L, Acc) ->
Concatted = concatenate(L),
[Non_lists|Remainder] = find_sublist(Concatted),
flatten(Remainder, concatenate([Acc, Non_lists])).
find_sublist(L) ->
find_sublist(L, []).
find_sublist([], Acc) ->
reverse(Acc);
find_sublist(L = [[_|_]|_], Acc) ->
[reverse(Acc)|L];
find_sublist([H|T], Acc) ->
find_sublist(T, [H|Acc]).
tests() ->
[1,2,3,4,4,5,6,7,8] = flatten([[1,[2,[3],[]]], [[[4,[4]]]], [[5],6], [[[]]], [], [[]], [[[7, 8]]]]),
[1,2] = flatten([[1,2]]),
[1,2,3] = flatten([[1],[2],[3]]),
[1,2,3,4,5,6] = flatten([[1,[2,[3],[]]], [[[4]]], [5,6]]),
tests_successful.