Erlang: primer elemento de una lista que coincide con alguna condición (sin evaluar el resto de los elementos)
Como ejemplo simple, supongamos que tengo una lista de númerosL
y quiero encontrar el primer elemento que sea mayor que un número específicoX
. Podría hacer esto con listas de comprensión como esta:
([email protected])24> L = [1, 2, 3, 4, 5, 6].
[1,2,3,4,5,6]
([email protected])25> X = 2.5.
2.5
([email protected])26> [First | _] = [E || E <- L, E > X].
[3,4,5,6]
([email protected])27> First.
3
Pero esto parece potencialmente muy ineficiente, ya que la lista podría ser muy larga y la primera coincidencia podría ser temprana. Así que me pregunto si a) ¿Hay alguna forma eficiente de hacerlo que no evalúe el resto de los elementos de la lista después de encontrar la primera coincidencia? o b) Cuando se compila, ¿Erlang optimiza el resto de las comparaciones de todos modos?
Así es como lograría lo que estoy buscando en C:
int first_match(int* list, int length_of_list, float x){
unsigned int i;
for(i = 0; i < length_of_list, i++){
if(x > list[i]){ return list[i]; } /* immediate return */
}
return 0.0; /* default value */
}