在调用嵌套函数序列的结果中删除空列表

时间:2012-02-16 19:50:34

标签: 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.

因此,基本上该函数对每个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 :(得分:0)

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

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

答案 1 :(得分:0)

这足以隐藏过滤:

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

答案 2 :(得分:0)

列出:flatmap可能会做你想要的事情

答案 3 :(得分:-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.