Erlang: Pierwszy element na liście pasujący do jakiegoś warunku (bez oceny pozostałych elementów)
Jako prosty przykład, załóżmy, że mam listę liczbL
i chcę znaleźć pierwszy element, który jest większy niż określony numerX
. Mógłbym to zrobić dzięki takim listom:
([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
Ale wydaje się to potencjalnie bardzo nieefektywne, ponieważ lista może być bardzo długa, a pierwszy mecz może być na początku. Zastanawiam się więc, czy a) Czy istnieje skuteczny sposób, aby nie ocenić pozostałych elementów na liście po znalezieniu pierwszego meczu? lub b) Kiedy to zostanie skompilowane, czy Erlang i tak optymalizuje pozostałe porównania?
W ten sposób osiągnę to, czego szukam w 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 */
}