2011-08-03 23 views
5

在Erlang中編寫if語句的最簡單方法是什麼,其中的一部分後衛是member(E, L),即測試E是否爲列表L的成員?天真的做法是:檢查Erlang後衛的成員

if 
    ... andalso member(E,L) -> ... 
end 

但就是不監守工作,如果我理解正確的話,member不是後衛的表達。哪種方式可行?

回答

12

如您所說,會員功能不是有效的警衛。相反,你可能會考慮使用案例模式?可能會在case表達式中包含其他if-clause。

case {member(E,L),Expr} of 
    {true,true} -> do(), is_member; 
    {true,false} -> is_member; 
    {false,_} -> no_member 
end 
+0

不錯。我希望避免使用布爾值作爲case子句,但至少它讓我無需在if語句中嵌套case語句。 –

+1

在case語句中使用布爾值是很常見的,可能比使用「if」時更常見。 –

6

在Erlang中不可能測試一名警衛的名單成員身份。您必須這樣做:

f(E, L) -> 
    case lists:member(E, L) of 
     true -> ...; 
     false -> ... 
    end. 
2

最簡單的事情是要考慮警衛模式匹配的部分,哪些不能,或者說是很難,表達模式本身的一部分。所以後衛是一系列後衛測試而不是布爾表達式。最初的守衛語法使得更容易看出差異,但是現在它們看起來像布爾表達式,但它們不是。