Functional programming 在调用一系列嵌套函数的结果中去掉空列表

Functional programming 在调用一系列嵌套函数的结果中去掉空列表,functional-programming,erlang,nested,nested-lists,Functional Programming,Erlang,Nested,Nested Lists,假设我们有一个函数: generate([],Result) -> Result; generate([H|T],Result) -> case H > 0 of true -> generate(T,[H*2|Result]); false -> generate(T,Result) end. do_generate([],Result) -> Result; do_generate([Lis

假设我们有一个函数:

generate([],Result) ->
    Result;
generate([H|T],Result) ->
    case H > 0 of
        true -> generate(T,[H*2|Result]);
        false -> generate(T,Result)
    end.
do_generate([],Result) ->
    Result;
do_generate([List|Other_lists],Result) ->
    do_generate(Other_lists,[generate(List,[])|Result]).
所以,基本上函数对每个H做一些事情,并将这些事情添加到结果中

现在,如果我从另一个函数调用generate:

generate([],Result) ->
    Result;
generate([H|T],Result) ->
    case H > 0 of
        true -> generate(T,[H*2|Result]);
        false -> generate(T,Result)
    end.
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嵌入到其他函数中,结果列表中可能会出现更多的空列表,这对以后的使用非常不方便

除了每次使用案例生成列表[]=[]检查外,我如何避免以其他方式添加[]以产生结果


调用深度嵌套函数序列并在最终结果中轻松去除空列表[]有什么“最佳实践”吗?

您可以简单地筛选值:

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

您可以从结果中删除所有空列表,如

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

这可以很好地隐藏过滤:

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

列表:flatmap可以做你想做的事情

只是一个小提示:即使长度很快,对于非常大的列表,这个过滤器通常也会变慢。最好这样写:do|u generate[],Result->[M||[|]=M[M||M false;true->true end];这避免了长度函数sac,这是我试图避免的方式-想象一下,我有许多类似于generate的函数。然后在每个do_fun中,我必须在每个函数中引入这种庞大的“case类型”构造。我认为这比事后使用lists comprehension或lists:filter进行过滤要好。