2012-02-16 1 views
0

Disons que nous avons une fonction:Débarrassez-vous des listes vides suite à l'appel d'une séquence de fonctions imbriquées

generate([],Result) -> 
    Result; 
generate([H|T],Result) -> 
    case H > 0 of 
     true -> generate(T,[H*2|Result]); 
     false -> generate(T,Result) 
    end. 

Donc, essentiellement la fonction fait quelque chose avec chaque H et ajoute ce quelque chose à Result.

Maintenant, si je l'appelle generate() d'une autre fonction:

do_generate([],Result) -> 
    Result; 
do_generate([List|Other_lists],Result) -> 
    do_generate(Other_lists,[generate(List,[])|Result]). 

Le problème est que je ne veux pas la fonction do_generate() pour ajouter une liste vide [] à son résultat. Que faire si j'appelle le do_generate([[0,0],[1,2]],[])? Je peux finir avec quelque chose comme ceci: [[2,4],[]].

Si j'intègre do_generate() dans d'autres fonctions, je pourrais finir par avoir encore plus de listes vides dans la liste des résultats, ce qui est très pratique pour une utilisation ultérieure.

Comment puis-je éviter d'ajouter [] à Result d'une autre manière que de vérifier avec case generate(List,[]) == [] of chaque fois?

Existe-t-il une «meilleure pratique» pour appeler une séquence de fonctions profondément imbriquées et se débarrasser des listes vides [] dans le résultat final avec facilité?

Répondre

0

vous pouvez vous débarrasser de toutes les listes vides du résultat, comme

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

Juste un conseil mineur: Même si la longueur est rapide, ce filtre peut généralement devenir lent pour les très grandes listes. Mieux vaut l'écrire comme ceci: do_generate ([], Résultat) -> [M || [_ | _] = M <- Résultat]; – aronisstav

+0

'[M || M <- Résultat, (début (si M == [] -> faux; vrai -> fin vrai) fin)]; 'Ceci évite cette fonction' length' –

-1

Vous pouvez simplement filtrer la valeur:

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 sac, c'est la façon dont j'essaie d'éviter - imaginez, j'ai de nombreuses fonctions similaires à générer(). Ensuite, dans chaque do_fun(), je devrais introduire cette encombrante 'casse GenRes of' dans chaque fonction. – skanatek

+0

Je pense que c'est mieux que de faire le filtrage après le fait en utilisant des listes de compréhension ou des listes: filtre. – Isac

0

Ce cache le filtrage assez bien:

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

listes: flatmap pourrait faire ce que vous voulez