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.