2014-08-28 5 views
0

У меня есть этот пример здесь, я запускаю его с 1, [1, 2, 3, 1, 4, 1]Последовательная Erlang недоразумение

example(_, []) -> []; 
example(X, [X | Rest]) -> Rest; 
example(X, [Y | Rest]) -> [Y | example(X, Rest)]. 

В моей голове (который прилагается к моему телу) я get [2,3,4], но компилятор говорит [2,3,1,4,1]. Как так? Либо я слишком устал, либо не понимаю этого.

Помощь приветствуется!

ответ

3

Ну, так как ваш первый параметр соответствует головке списка, используется вторая перегрузка, приводящая к Rest, которая равна [2,3,1,4,1], заканчивая «рекурсию». Как всегда, компилятор прав;)

Возможно, вы хотели бы написать example(X, [X | Rest]) -> example(X, Rest)? Это действительно удалит все 1 s, а не только первое.

1

Классы сопоставлены сверху донизу.

Вы звоните example(1, [1,2,3,1,4,1]).

Во-первых, erlang постарается сопоставить снова (_,[]). Это не удастся, потому что ваш второй аргумент не пустой список.

Второй матч будет соответствовать (X,[X | Rest). X ограничивается 1, поэтому второй параметр «есть» теперь [1 | Rest]. Это приведет к успеху в матче с [1,2,3,1,4,1], потому что первый элемент списка - 1 (значение X).

1

Вы можете попробовать:

example(_, []) -> []; 
example(X, [X | Rest]) -> example(X, Rest); 
example(X, [Y | Rest]) -> [Y | example(X, Rest)]. 

wy:example(1, [1,2,3,1,1]). удалит все elment 1.

+0

Это один на 3 часа позже, и не включает в себя абсолютно никакой дополнительной информации по сравнению с существующими ответами Краб и меня. – filmor

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