0

2 つのアトムの値をチェックするメソッドを実行しようとしています。それらが互いに同等である場合は false であり、同等でない場合は true となります。

私のコードは次のようになります。

b_not(X, Y) ->
if
    X=:=Y ->
        false;
else
        true;
end.

ここでのメソッドの名前は、boolean_not を表す「b_not」です。そして、X が Y と正確に等しいかどうかを if ステートメントで確認すると、false になります。わかりました、その部分だけでできました。しかし、私の問題は、else ステートメントを作成しようとしたときに発生します。私はこの部分を取得していないようです, インターネットで検索しようとしましたが、取得できないようです. ですから、Erlang で if-else ステートメントがどのように機能するか教えていただければ幸いです!

ありがとうアレクセイ!

4

2 に答える 2

8

私はErlangに比較的慣れていませんが、言語はあなたが説明した方法で動作するように設計されていません. ifコンストラクトはありますが、あまり使用されていないと思います。

代わりに、パターンマッチングを使用して、次のように説明することができます。

b_not(_X, _X) -> false;
b_not(_, _) -> true.

アンダースコア パターン マッチはワイルドカードを示します。アンダースコアが先行するパターン一致は、関数で値を使用するつもりはないが、一致自体は気にすることを意味します。

したがって、最初のパターン一致は、「_X を何にも使用するつもりはないが、両方の値が同じでなければならない」ことを意味します。

2 番目のパターン マッチは、「これらは使い捨ての値であり、何でもかまいません」という意味です。

多くの関数は複数の引数パターンで定義されており、Erlang はどのパターンが呼び出しに一致するかを判断します。

この場合、同じ値が 2 回渡された場合、それが整数、アトム、リスト、またはその他の型であるかどうかにかかわらず、最初のパターンが一致し、false が返されます。それ以外の場合は、2 番目のパターンが一致します。

これは、パターンがこの順序で定義されているためにのみ機能します。逆にすると、すべての引数が true になります。

イラスト:

16> foo:b_not(3, 3).
false
17> foo:b_not(3, 4).
true
19> foo:b_not(3, 3.0).
true
20> foo:b_not(match, match).
false
21> foo:b_not(match, nomatch).
true
22> foo:b_not([1, 2], [1, 2]).
false
23> foo:b_not([1, 2], [1, 2, 3]).
true
于 2012-09-12T13:06:15.453 に答える
8

それが=/=オペレーターの仕事です!

b_not(X, Y) -> X =/= Y.

if声明についてのあなたの混乱は理解できます。他の多くの言語のように機能しないため、マニュアルのifガードについてよく読む必要があります。これは Erlang でそれを実現する 1 つの方法です (ただし、「true の場合は true」は一種のアンチパターンなので、これを正確に行わないでください):if

if
  X =/= Y -> true;
  X =:= Y -> false
end

ガードの 1 つ(矢印の左側) がtrueアトムに評価されると、ifステートメントはその矢印に続く式に評価されることに注意してください。句はありませんが、矢印の前にelse置くことで自分で作成できます。true

if
  X =/= Y -> true;
  true -> false
end

これはあまり直感的ではなく、特に他の言語のバックグラウンドを持つ人にとってはそうではありません。これが、if式よりもパターン マッチングが好まれることが多い理由の 1 つだと思います。

完全を期すために、ケース式についても読んでください。これは、関数の本体内でパターン マッチングを行うためのものです。

case X of
  Y -> false;   % X equals Y
  _ -> true     % Everything else, i.e., X is not Y
end
于 2012-09-12T14:29:08.843 に答える