2015-02-19 3 views
0

Erlang новичок здесь. Я нахожусь на фоне Java и нахожу Эрлана довольно интересным. Следуйте за отличной книгой «Узнай, что у тебя есть Эрланг».Понимание переменной «_» в Erlang

Вот пример рекурсии, как указано в книге для изменения порядка в списке:

tail_reverse(L) -> tail_reverse(L,[]). 

tail_reverse([],Acc) -> Acc; 
tail_reverse([H|T],Acc) -> tail_reverse(T, [H|Acc]). 

Это работает, как ожидалось. Однако, если я изменил код:

tail_reverse(L) -> tail_reverse(L,[]). 

tail_reverse([],_) -> []; 
tail_reverse([H|T],Acc) -> tail_reverse(T, [H|Acc]). 

это теперь всегда возвращает [] независимо от содержания Списка прошло. Таким образом, кажется, что линия tail_reverse([],_) -> []; является вызываемой. Тем не менее, я понимаю, что он должен быть вызван только в том случае, если первый параметр пуст, а _ является просто заполнителем.

Что мне здесь не хватает?

ответ

3

Эта линия:

tail_reverse([], Acc) -> Acc 

должна вернуть накапливающийся аргумент Acc, когда обрабатываемый список становится пустым. Вы заменили его:

tail_reverse([], _) -> [] 

, который выполняется в том же случае (в нижней части рекурсии), но игнорирует ранее проделанную работу и возвращает пустой список.

Что касается переменной _, это не имеет особого отношения к вашей проблеме, но это объясняется в ответе this.

+0

Ah! немой, чтобы этого не видеть! Необходимо потратить больше времени на использование кода/синтаксиса Erlang. Благодаря! – imme

0

@ Ответ на правильный ответ. Тем не менее, я собираюсь представить свой ответ на общий вопрос «Каким образом _ переменной работы в Erlang Я недавно написал сообщение в блоге на _ переменном:.

Анонимные переменным обозначаются одним подчеркиванием (_). Анонимная переменная используется, когда требуется переменная, но значение нужно игнорировать. Анонимная переменная никогда не имеет привязанного к ней значения. Поскольку значение никогда не связано, оно может использоваться несколько раз в шаблоне и каждый раз, когда это разрешено, чтобы соответствовать другое значение. Пример:

1> {_, _} = {foo, bar}. 
{foo, bar} 
2> _. 
* 1: variable '_' is unbound 
4> {_, Second} = {foo, bar}. 
{foo, bar} 
5> _. 
* 1: variable '_' is unbound 
6> Second. 
bar 

Подробнее можно ознакомиться здесь: http://stratus3d.com/blog/2014/11/05/everything-you-need-to-know-about-erlangs-magic-variable/

Смежные вопросы