Erlang: Erstes Element in einer Liste, das einer Bedingung entspricht (ohne den Rest der Elemente zu bewerten)
Nehmen wir als einfaches Beispiel an, ich habe eine Liste von ZahlenL
und ich möchte das erste Element finden, das größer als eine bestimmte Zahl istX
. Ich könnte dies mit Listenverständnissen wie diesem tun:
([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
Dies scheint jedoch potenziell sehr ineffizient zu sein, da die Liste sehr lang sein und das erste Spiel möglicherweise früh beginnen könnte. Ich frage mich also, ob es entweder a) eine effiziente Möglichkeit gibt, die den Rest der Elemente in der Liste nicht bewertet, nachdem die erste Übereinstimmung gefunden wurde? oder b) Wenn dies kompiliert wird, optimiert Erlang den Rest der Vergleiche trotzdem?
So würde ich erreichen, wonach ich in C suche:
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 */
}