Mam problem z kodowaniem w Erlang, który jest prawdopodobnie typowym wzorcem projektowym, ale nie mogę znaleźć żadnych informacji, jak go rozwiązać.Wzór projektu? Funkcja iterująca po liście w poszukiwaniu pierwszego wyniku {success}
Mam listę L. Chcę zastosować funkcję f do każdego elementu w L, i mieć go uruchomić we wszystkich elementach w L jednocześnie. Każde wywołanie f (Element) zakończy się albo zakończy się niepowodzeniem; w większości przypadków to się nie powiedzie, ale od czasu do czasu uda mu się to dla konkretnego elementu w obrębie L.
Jeśli/kiedy af (Element) się powiedzie, chcę powrócić "sukces" i zakończyć wszystkie wywołania f dla inne elementy w L - pierwszy "sukces" jest wszystkim, czym jestem zainteresowany. Z drugiej strony, jeśli f (Element) zawodzi dla każdego elementu w L, wtedy chcę zwrócić "fail".
Jako trywialny przykład załóżmy, że L jest listą liczb całkowitych, a F zwraca {sukces}, jeśli element w L wynosi 3, lub {fail} w przypadku dowolnej innej wartości. Chcę znaleźć tak szybko jak to możliwe, jeśli są jakieś 3s w L; Nie dbam o to, ile jest 3, tylko o to, czy co najmniej jeden istnieje, czy nie. f mogłaby wyglądać następująco:
f(Int) ->
case Int of
3 -> {success};
_ -> {fail}
end.
Jak mogę iterację listy Ints aby dowiedzieć się, czy lista zawiera co najmniej jedną 3 i wrócić tak szybko, jak to możliwe?
Z pewnością jest to wspólny funkcjonalne wzornictwo, a ja po prostu nie używając prawidłowych warunków wyszukiwania w Google ...
Możesz to zoptymalizować, zdając sobie sprawę, że w 'wait_for_result/2' nie jesteśmy naprawdę zainteresowani tym, który pracownik zwraca' false', tylko ilu to zrobiło. Wystarczy więc usunąć pierwszy element listy za każdym razem. – rvirding
Powinieneś również wspomnieć, że wykonanie 'exit (have_result)' zabije wszystkie pozostałe procesy robocze, ponieważ są one połączone (rozpoczynane z 'spawn_link') i' have_result' nie jest 'normalne', więc jest traktowane jako wyjście błędu. – rvirding
Masz oczywiście rację. Zaktualizował odpowiedź swoimi komentarzami. –