2009-08-14 105 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 2009-08-15 10:58:21

+0

關於範圍如何在Erlang中工作的很好的解釋。精彩的List-Comprehension-Ninja – Aus 2017-05-03 11:28:08