Ví dụ đơn giản, giả sử tôi có danh sách các số L
và tôi muốn tìm phần tử đầu tiên lớn hơn một số số cụ thể X
. Tôi có thể thực hiện việc này với tính năng hiểu danh sách như sau:Erlang: Phần tử đầu tiên trong danh sách khớp với một số điều kiện (không đánh giá phần còn lại của các phần tử)
([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
Nhưng điều này có vẻ rất không hiệu quả vì danh sách có thể rất dài và khớp đầu tiên có thể sớm. Vì vậy, tôi tự hỏi liệu một trong hai) Có một cách hiệu quả để làm điều này mà sẽ không đánh giá phần còn lại của các yếu tố trong danh sách sau khi trận đấu đầu tiên được tìm thấy? hoặc b) Khi điều này được biên dịch, Erlang có tối ưu hóa phần còn lại của các so sánh không?
Đây là cách tôi sẽ đạt được những gì tôi đang tìm kiếm trong 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 */
}
Tuyệt. Điều này là ngắn gọn hơn so với giải pháp của tôi. Tôi đã phải làm một chút tìm kiếm để xác minh rằng 'dropwhile' trong thực tế dừng đánh giá sau khi trận đấu thất bại đầu tiên. Tôi bọc nó lên trong một hàm cho phép bạn chỉ định điều kiện như một hàm (mà không phải đảo ngược logic): https://gist.github.com/3807110 – dantswain