3

私は現在、Erlang を取り上げています。そのパターン マッチングは、私が最近見た中で最もクールなものの 1 つです。演習で思いついた小さなおもちゃの関数は次のとおりです。

b_and(true, true) ->
  true;
b_and(true, false) ->
  false;
b_and(false, true) ->
  false;
b_and(false, false) ->
  false;
b_and(_, _) ->
  {error, invalid_object}.

しかし、列挙されたアトムのセットからのみ受け入れるようにパターン内の変数に指示する構文はありますか? そうすれば、次のように短縮できます。

b_and(true, true) ->
  true;
% We've already satisfied the only true case
b_and(ENUM(true, false), ENUM(true, false)) ->
  false;
b_and(_, _) ->
  {error, invalid_object}.

パターン マッチングに関するドキュメントを調べましたが、このようなものは見つかりませんでした。

4

5 に答える 5

4

現在、アトムのリストをパターンとして指定する直接的な方法はありません。

あなたの場合、ガードを使用できますが、それはほとんど短くありません

b_and(true, true) -> true;
b_and(A, B) when A =:= true or A =:= false,
                 B =:= true or B =:= false ->
    false.

ところで、関数を他のもので呼び出すとエラーになる場合、エラー句をオフのままにしておくことがよくあります。

この解析変換https://github.com/mad-cocktail/ginを使用すると、ガードの in() フォームが得られます。問題は、それだけの価値があるかどうかです。解析変換を持つ機能は、それほど頻繁には使用されず、少し重いように見えます。

于 2013-07-21T09:57:28.630 に答える
0

このようなことに取り組む方法について別の答えを出すために:

b_and(true, B) -> bool(B);
b_and(false, B) -> bool(B, false).

bool(B) -> bool(B, B).
bool(true, Res) -> Res;
bool(false, Res) -> Res;
bool(_, _) -> {error, invalid_object}.

ただし、ここで無効な引数をマスクするべきではありません。不適切な引数で呼び出されることが予想され、例外ではなくエラー メッセージを返したい場合を除きます。

于 2013-07-21T18:44:09.420 に答える
0

これを書くだけでOKです。

b_and(true,true) -> true ;
b_and(A,B) when is_boolean(A),is_boolean(B) -> false.

Peer Stritzinger が言うように、不適切な引数で呼び出された場合は、クラッシュさせて、ブール値で呼び出すようにしてください。

于 2013-07-22T10:15:59.787 に答える