Допустим, мы имеем функцию:Избавьтесь от пустых списков в результате вызова последовательность вложенных функций
generate([],Result) ->
Result;
generate([H|T],Result) ->
case H > 0 of
true -> generate(T,[H*2|Result]);
false -> generate(T,Result)
end.
Таким образом, в основном функция делает что-то с каждым H
и добавляет это что-то Result
.
Теперь, если я позвоню generate()
из другой функции:
do_generate([],Result) ->
Result;
do_generate([List|Other_lists],Result) ->
do_generate(Other_lists,[generate(List,[])|Result]).
Проблема заключается в том, что я не хочу, чтобы функция do_generate()
добавить пустой список []
к его результату. Что, если я позвоню do_generate([[0,0],[1,2]],[])
? Я могу в итоге что-то вроде этого: [[2,4],[]]
.
Если я вставляю do_generate()
в другие функции, я могу получить еще более пустые списки внутри списка результатов, что очень неудобно для последующего использования.
Как я могу избежать добавления []
в Result
иначе, чем при проверке case generate(List,[]) == [] of
?
Есть ли «лучшая практика» для вызова последовательности глубоко вложенных функций и избавления от пустых списков []
в конечном результате с легкостью?
Небольшой совет: даже если длина выполняется быстро, этот фильтр может вообще замедляться для очень больших списков. Лучше напишите так: do_generate ([], Результат) -> [M || [_ | _] = M <- Результат]; – aronisstav
'[M || M <- Результат, (begin (если M == [] -> false; true -> true end) end)]; 'Это позволяет избежать этой функции' length' –