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