假设我们有一个功能:
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 :(得分: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.