2017-02-26 8 views
1

を警告しません。しかし定義Erlangのは、未使用の関数の引数

isEqual(X,X) -> 1. 

は何の警告を生成しませんが、

isEqual(X,X) -> 1; 
isEqual(X,Y) -> 0. 

は再びだけ二行目の警告を生成します。

+2

おそらく、ここでは 'X'_is_が使用されているため、Erlangは第1引数と第2引数を比較して等価であると考えられます。 – Dogbert

答えて

6

2番目のケースでは、同じ変数名を使用して(パターンマッチングによって)、isEqual/2の最初と2番目の引数が同じ値を持つためです。実際には引数の値を使用しています。

is_equal/2から生成されたCore Erlangコードを見ると、より理解しやすくなります。 .erlファイルをerlc +to_core pattern.erlpattern.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は使用されません。

+0

私はRHS上でXを使うのを忘れていたかもしれないので、警告が生成されるはずだと思います。私が正しく理解しているのは、バインディング(X、X)のパターンマッチングコードには、Xを使用する追加の制約があり、(編集された)定義のバインディング(X、Y)のコードには存在しないということです'isEqual()'。 – farhanhubble

+0

@farhanhubble答えにいくつかの情報を追加しました。 –