在Erlang中編寫if語句的最簡單方法是什麼,其中的一部分後衛是member(E, L)
,即測試E
是否爲列表L
的成員?天真的做法是:檢查Erlang後衛的成員
if
... andalso member(E,L) -> ...
end
但就是不監守工作,如果我理解正確的話,member
不是後衛的表達。哪種方式可行?
在Erlang中編寫if語句的最簡單方法是什麼,其中的一部分後衛是member(E, L)
,即測試E
是否爲列表L
的成員?天真的做法是:檢查Erlang後衛的成員
if
... andalso member(E,L) -> ...
end
但就是不監守工作,如果我理解正確的話,member
不是後衛的表達。哪種方式可行?
如您所說,會員功能不是有效的警衛。相反,你可能會考慮使用案例模式?可能會在case表達式中包含其他if-clause。
case {member(E,L),Expr} of
{true,true} -> do(), is_member;
{true,false} -> is_member;
{false,_} -> no_member
end
在Erlang中不可能測試一名警衛的名單成員身份。您必須這樣做:
f(E, L) ->
case lists:member(E, L) of
true -> ...;
false -> ...
end.
最簡單的事情是要考慮警衛模式匹配的部分,哪些不能,或者說是很難,表達模式本身的一部分。所以後衛是一系列後衛測試而不是布爾表達式。最初的守衛語法使得更容易看出差異,但是現在它們看起來像布爾表達式,但它們不是。
不錯。我希望避免使用布爾值作爲case子句,但至少它讓我無需在if語句中嵌套case語句。 –
在case語句中使用布爾值是很常見的,可能比使用「if」時更常見。 –