Избавьтесь от пустых списков в результате вызова последовательности вложенных функций - PullRequest
0 голосов
/ 16 февраля 2012

Допустим, у нас есть функция:

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?

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

Ответы [ 4 ]

0 голосов
/ 17 февраля 2012

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

0 голосов
/ 17 февраля 2012

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

 do_generate([],Result) -> [M|| M <-  Result, length(M) >0];
0 голосов
/ 17 февраля 2012

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

do_generate(Input) ->
    [Res || [_|_] = Res <- [generate(List,[]) || List <- Input]].
0 голосов
/ 17 февраля 2012

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

do_generate([List|Other_lists],Result) ->
    GenRes = generate(List,[]),
    case GenRes of 
        [] -> do_generate(Other_lists, Result);
        _  -> do_generate(Other_lists,[GenRes|Result])
    end.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...