2009-08-14 14 views
20

は、なぜこのコードをコンパイルん:なぜErlang変数が使用されていないのですか?

triples([], _,_,_)-> 
    []; 

triples(Self, X, Y, none)-> 
    [ Result || Result = { X, Y, _} <- Self ]. 

レポート:

./simple_graph.erl:63: Warning: variable 'X' is unused 
./simple_graph.erl:63: Warning: variable 'Y' is unused 
./simple_graph.erl:64: Warning: variable 'X' is unused 
./simple_graph.erl:64: Warning: variable 'X' shadowed in generate 
./simple_graph.erl:64: Warning: variable 'Y' is unused 
./simple_graph.erl:64: Warning: variable 'Y' shadowed in generate 

そして間違った結果を返す:完全な自己を。

答えて

51

これは、ここでXとYのジェネレータのLHSで発生する変数は常に新しいアンバインド変数であるため、理解にはローカルです。これは、それらがトリプルの先頭のXとYと同じ変数ではないことを意味し、したがって、暗黙的な等価性テストは存在しません。これは、楽しいことの頭に現れるすべての変数が、楽しいところの新しい変わる変数であるという楽しい点に似ています。

これはerlangの残りの部分とは異なります。なぜなら、コンパイラは頭の中のXとYが使われていないだけでなく、理解のXとYが他の変数を隠しているということです。彼らはまた、理解のどこにも使用されていません。

あなたが望む結果を得るための簡単な方法は次のとおりです。

[ Result || Result = {X1,Y1,_} <- Self, X =:= X1, Y =:= Y1 ] 
+5

うわー。これはゴチャです! – Christian

+0

Erlangでスコープがどのように機能するかについての素晴らしい説明。そして鮮やかなリスト理解 - 忍者 – Aus

関連する問題