2012-02-16 3 views
0

Допустим, мы имеем функцию:Избавьтесь от пустых списков в результате вызова последовательность вложенных функций

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?

Есть ли «лучшая практика» для вызова последовательности глубоко вложенных функций и избавления от пустых списков [] в конечном результате с легкостью?

ответ

0

вы можете избавиться от всех пустых списков из результата, как

do_generate([],Result) -> [M|| M <- Result, length(M) >0]; 
+0

Небольшой совет: даже если длина выполняется быстро, этот фильтр может вообще замедляться для очень больших списков. Лучше напишите так: do_generate ([], Результат) -> [M || [_ | _] = M <- Результат]; – aronisstav

+0

'[M || M <- Результат, (begin (если M == [] -> false; true -> true end) end)]; 'Это позволяет избежать этой функции' length' –

-1

Вы можете просто выбирать значение:

do_generate([List|Other_lists],Result) -> 
    GenRes = generate(List,[]), 
    case GenRes of 
     [] -> do_generate(Other_lists, Result); 
     _ -> do_generate(Other_lists,[GenRes|Result]) 
    end. 
+0

I мешок, это то, что я пытаюсь избежать - представьте, у меня есть много функций, подобных функции generate(). Тогда в каждом do_fun() я должен был бы ввести этот громоздкий «случай» из «конструкции» в каждой функции. – skanatek

+0

Я думаю, что это лучше, чем делать фильтрацию после факта использования списков или списков: filter. – Isac

0

Это скрывает фильтрации достаточно хорошо:

do_generate(Input) -> 
    [Res || [_|_] = Res <- [generate(List,[]) || List <- Input]]. 
0

списки: flatmap может делать то, что вы хотите