J'ai un problème de codage dans Erlang qui est probablement un modèle de conception commun, mais je ne trouve aucune information sur la façon de le résoudre.Motif de conception? Fonction d'itération dans une liste à la recherche du premier résultat {succès}
J'ai une liste L. Je veux appliquer une fonction f à chaque élément de L, et l'exécuter simultanément sur tous les éléments de L. Chaque appel à f (élément) réussira ou échouera; dans la majorité des cas, il échouera, mais occasionnellement il réussira pour un élément spécifique au sein de L.
Si/quand af (Element) réussit, je veux retourner "succès" et terminer toutes les invocations de f pour D'autres éléments dans L - le premier "succès" est tout ce qui m'intéresse. D'un autre côté, si f (Element) échoue pour chaque élément dans L, alors je veux retourner "fail". Supposons que L soit une liste d'entiers, et F renvoie {succès} si un élément de L est 3 ou {échec} pour toute autre valeur. Je veux trouver le plus rapidement possible s'il y a des 3 dans L; Je me fiche du nombre de 3, juste si au moins un 3 existe ou non. f pourrait ressembler à ceci:
f(Int) ->
case Int of
3 -> {success};
_ -> {fail}
end.
Comment puis-je itérer une liste de Ints pour savoir si la liste contient au moins un 3, et revenir le plus rapidement possible?
Assurément, c'est un modèle de conception fonctionnelle commune, et je ne suis pas en utilisant les termes de recherche de Google ...
Vous pouvez optimiser ceci en réalisant que dans 'wait_for_result/2' nous ne sommes pas vraiment intéressés par le worker qui retourne' false', juste combien qui l'ont fait. Il suffit donc de supprimer le premier élément de la liste à chaque fois. – rvirding
Vous devez également mentionner que faire 'exit (have_result) va tuer tous les processus de travail restants car ils sont liés (démarrés avec' spawn_link') et 'have_result' n'est pas' normal', donc traité comme une sortie d'erreur. – rvirding
Vous avez raison, bien sûr. Mise à jour de la réponse avec vos commentaires. –