Подтвердить что ты не робот

Почему переменная 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

И вернуть неправильный результат: полное Я.

4b9b3361

Ответ 1

Это потому, что переменные, происходящие на LHS генераторов, X и Y здесь, всегда являются новыми несвязанными переменными, локальными для понимания. Это означает, что они не являются теми же переменными, что и X и Y в начале тройки, и поэтому нет никакого неявного теста на равенство. Это похоже на funs, где все переменные, встречающиеся в голове удовольствия, являются новыми переменными, локальными для удовольствия.

Это отличается от большинства остальных erlang, поэтому компилятор не только предупреждает, что X и Y в голове не используются, но также и то, что X и Y в понимании затеняют другие переменные. Они также не используются в понимании.

Легкий способ получить то, что вам нужно:

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