2011-08-03 11 views
5

ガードの一部がmember(E, L)のErlangでif文を書く最も簡単な方法は、EがリストLのメンバーであるかどうかをテストすることですか?単純なアプローチがある:Erlangガードのメンバシップを確認する

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

しかし、私は正しく理解していれば、becuase動作しないで、memberはガード式ではありません。どちらの方法でうまくいくのですか?

答えて

12

メンバーの機能は、あなたが言うように、有効なガードではありません。代わりに、ケースパターンの使用を検討することがありますか? case式に他のif節を含めることも可能です。

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

ニース。私はブール値をcase節として使うことを避けたいと考えましたが、少なくともif文の中にcase文を入れ子にする必要はありません。 –

+1

ケースステートメントでブール値を使用することはかなり一般的です。おそらく、ifの使用よりも一般的です。 –

6

Erlangのガードのリストメンバーシップをテストすることはできません。これを行う必要があります:

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

最も簡単なものは、パターンマッチングの一部としてガードを検討し、パターン自体では発現しないか、またはが困難な部分です。したがって、ガードは、ガードテストのシーケンスであり、ブール式ではありません。元のガードシンタックスは違いを見やすくしましたが、今はブール式のように見えますが、そうではありません。

関連する問題