2009-08-14 75 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