【问题标题】:Get rid of empty lists in a result of calling a sequence of nested functions在调用一系列嵌套函数的结果中删除空列表
【发布时间】:2012-02-16 19:50:33
【问题描述】:

假设我们有一个函数:

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() 嵌入到其他函数中,我最终可能会在结果列表中得到更多的空列表,这对于以后的使用非常不方便。

除了每次都检查case generate(List,[]) == [] of之外,如何避免将[]添加到Result

是否有任何“最佳实践”可以调用一系列深度嵌套的函数并在最终结果中轻松摆脱空列表[]

【问题讨论】:

    标签: functional-programming erlang nested nested-lists


    【解决方案1】:

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

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

    【讨论】:

    • 小提示:尽管长度很快,但对于非常大的列表,此过滤器通常会变慢。最好这样写:do_generate([],Result) -> [M || [|] = M
    • [M || M &lt;- Result, (begin (if M == [] -&gt; false;true -&gt; true end) end)]; 这避免了 length 函数
    【解决方案2】:

    这很好地隐藏了过滤:

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

    【讨论】:

      【解决方案3】:

      lists:flatmap 可能会做你想做的事

      【讨论】:

        【解决方案4】:

        您可以简单地过滤值:

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

        【讨论】:

        • Isac,这是我试图避免的方式 - 想象一下,我有许多类似于 generate() 的函数。然后在每个 do_fun() 中,我必须在每个函数中引入这个庞大的“case GenRes of”构造。
        • 我认为这比事后使用列表理解或列表进行过滤要好:过滤器。
        猜你喜欢
        • 2021-08-21
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        相关资源
        最近更新 更多