2012-02-16 20 views
0

比方說,我們有一個函數:在調用的嵌套函數序列的結果擺脫空列表的

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

是否有任何'最佳實踐'調用一系列深層嵌套函數,並在最終結果中輕鬆清除空列表[]

回答

0

你可以擺脫從結果所有空列表,像

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

只是一個小提示:即使長度很快,對於非常大的列表來說,這個過濾器通常會變得很慢。最好這樣寫: do_generate([],Result) - > [M || [_ | _] = M < - 結果]; – aronisstav 2012-02-16 20:53:17

+0

'[M || M < - Result,(begin(if M == [] - > false; true - > true end)end)];'這樣可以避免'length'函數 – 2012-02-17 05:06:08

-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. 
+0

I這是我試圖避免的方式 - 想象一下,我有許多類似於generate()的函數。然後在每個do_fun()中,我將不得不在每個函數中引入這個龐大的'case GenRes'結構。 – skanatek 2012-02-17 09:12:04

+0

我認爲這比使用列表理解或列表的事實進行過濾要好:過濾器。 – Isac 2012-02-17 13:27:11

0

這個隱藏過濾不夠好:

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

列表:flatmap可能做你想做的事