Tengo un problema de codificación en Erlang que probablemente sea un patrón de diseño común, pero no encuentro información sobre cómo resolverlo.¿Patrón de diseño? Función que itera a través de una lista en busca del primer resultado {success}
Tengo una lista L. Quiero aplicar una función f a cada elemento en L, y hacer que se ejecute en todos los elementos en L al mismo tiempo. Cada llamada a f (Elemento) tendrá éxito o fallará; en la mayoría de los casos se producirá un error, pero en ocasiones tendrá éxito para un elemento específico dentro L.
Si/cuando af (Elemento) tiene éxito, quiero volver "éxito" y terminar todas las invocaciones de f de otros elementos en L - el primer "éxito" es todo lo que me interesa. Por otro lado, si f (Element) falla para cada elemento en L, entonces quiero devolver "fail".
Como ejemplo trivial, supongamos que L es una lista de enteros, y F devuelve {success} si un elemento en L es 3 o {falla} para cualquier otro valor. Quiero encontrar lo más rápido posible si hay 3 en L; No me importa cuántos 3 hay, solo si existe al menos un 3 o no. f podría tener este aspecto:
f(Int) ->
case Int of
3 -> {success};
_ -> {fail}
end.
¿Cómo puedo iterar a través de una lista de enteros para averiguar si la lista contiene al menos un 3, y volver lo más rápido posible?
Sin duda, este es un patrón de diseño funcional común, y yo no estoy usando los términos de búsqueda adecuados dentro de Google ...
Puede optimizar esto al darse cuenta de que en 'wait_for_result/2' no estamos realmente interesados en qué trabajador devuelve' false', solo cuántos lo han hecho. Por lo tanto, es suficiente eliminar el primer elemento de la lista cada vez. – rvirding
También debe mencionar que al hacer 'exit (have_result)' se eliminarán todos los procesos de trabajo restantes, ya que están enlazados (comenzados con 'spawn_link') y' have_result' no es 'normal', por lo que se trata como un error de salida. – rvirding
Tiene razón, por supuesto. Actualizó la respuesta con sus comentarios. –