Erlang:匹配某些条件的列表中的第一个元素(不评估其余元素)

dan*_*ain 5 erlang list-comprehension list

举个简单的例子,假设我有一个数字列表,L我想找到第一个大于某个特定数字的元素X.我可以用这样的列表推导做到这一点:

(mynode@127.0.0.1)24> L = [1, 2, 3, 4, 5, 6].              
[1,2,3,4,5,6]
(mynode@127.0.0.1)25> X = 2.5.
2.5
(mynode@127.0.0.1)26> [First | _] = [E || E <- L, E > X].  
[3,4,5,6]
(mynode@127.0.0.1)27> First.
3
Run Code Online (Sandbox Code Playgroud)

但这似乎可能非常低效,因为列表可能很长,第一场比赛可能是早期的.所以我想知道是否a)是否有一种有效的方法来做到这一点,在找到第一个匹配后不会评估列表中的其余元素?或者b)当这个被编译时,Erlang是否会优化其余的比较?

这就是我如何实现我在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 */
}
Run Code Online (Sandbox Code Playgroud)

Odo*_*rus 12

好吧,像

firstmatch(YourList, Number) -> 
   case lists:dropwhile(fun(X) -> X =< Number end, YourList) of
     [] -> no_solution;
     [X | _] -> X
   end.
Run Code Online (Sandbox Code Playgroud)