Come un semplice esempio, supponiamo di avere un elenco di numeri L
e voglio trovare il primo elemento che è maggiore di un numero specifico X
. Potrei farlo con list comprehension come questo:Erlang: Primo elemento in una lista che corrisponde ad alcune condizioni (senza valutare il resto degli elementi)
([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
ma questo sembra potenzialmente molto inefficiente, dal momento che l'elenco potrebbe essere molto lungo e la prima partita potrebbe essere nella fase iniziale. Quindi mi chiedo se a) Esiste un modo efficace per fare ciò che non valuterà il resto degli elementi nella lista dopo che è stata trovata la prima corrispondenza? oppure b) Quando viene compilato, Erlang ottimizza comunque il resto dei confronti?
Questo è come vorrei ottenere ciò che sto cercando in 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 */
}
Bello. Questo è più conciso della mia soluzione. Ho dovuto fare un piccolo tentativo per verificare che 'dropwhile' non smettesse di valutare dopo la prima partita fallita. L'ho avvolto in una funzione che ti permette di specificare la condizione come una funzione (senza dover invertire la logica): https://gist.github.com/3807110 – dantswain