を警告しません。しかし定義Erlangのは、未使用の関数の引数
isEqual(X,X) -> 1.
は何の警告を生成しませんが、
isEqual(X,X) -> 1;
isEqual(X,Y) -> 0.
は再びだけ二行目の警告を生成します。
を警告しません。しかし定義Erlangのは、未使用の関数の引数
isEqual(X,X) -> 1.
は何の警告を生成しませんが、
isEqual(X,X) -> 1;
isEqual(X,Y) -> 0.
は再びだけ二行目の警告を生成します。
2番目のケースでは、同じ変数名を使用して(パターンマッチングによって)、isEqual/2
の最初と2番目の引数が同じ値を持つためです。実際には引数の値を使用しています。
is_equal/2
から生成されたCore Erlangコードを見ると、より理解しやすくなります。 .erl
ファイルをerlc +to_core pattern.erl
(pattern.erl
についてはここを参照)でコンパイルして、.core
ソースファイルを入手できます。あなたが見ることができるように
module 'pattern' ['is_equal'/2]
attributes []
'is_equal'/2 = fun (_cor1,_cor0) ->
case <_cor1,_cor0> of
%% Line 5
<X,_cor4> when call 'erlang':'=:=' (_cor4, X) ->
1
%% Line 6
<X,Y> when 'true' ->
0
end
、.erl
ソースコード内is_equal/2
から各機能句がcase
句に翻訳さ:
これは、このような何か(module_info/[0,1]
機能は削除)を見ていきますpattern.core
ファイルを生成しますコアアーランでX
は、他の引数と比較する必要があるため、最初の句で使用されます。一方、第2節ではX
またはY
は使用されません。
私はRHS上でXを使うのを忘れていたかもしれないので、警告が生成されるはずだと思います。私が正しく理解しているのは、バインディング(X、X)のパターンマッチングコードには、Xを使用する追加の制約があり、(編集された)定義のバインディング(X、Y)のコードには存在しないということです'isEqual()'。 – farhanhubble
@farhanhubble答えにいくつかの情報を追加しました。 –
おそらく、ここでは 'X'_is_が使用されているため、Erlangは第1引数と第2引数を比較して等価であると考えられます。 – Dogbert