作爲一個簡單示例,假設我有一個數字列表L
,並且我想查找大於某個特定數字的第一個元素X
。我可以列表理解這樣做:Erlang:匹配某些條件的列表中的第一個元素(不計算其餘元素)
([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
但這似乎可能是非常低效的,因爲這個名單可以很長,第一場比賽可能是早期。所以我想知道是否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 */
}
不錯。這比我的解決方案更簡潔。我確實需要做一些小小的觀察,以確認在第一次失敗比賽之後,「落差」確實會停止評估。我把它封裝在一個函數中,可以讓你指定條件作爲一個函數(而不必顛倒邏輯):https://gist.github.com/3807110 – dantswain