2015-10-25 2 views
2

Я пытаюсь создать функцию, которая возвращает последний элемент списка. Однако здесь что-то странно.Разница между запятой и | in erlang

last([X,[]]) -> X; 
last([_X|Xs]) -> last(Xs). 

Это возвращает ошибку предложения без согласования. Но если я сменил первую строку на last([X|[]]) -> X;, она будет работать правильно. Я думаю, что обе линии означают одно и то же, но они явно имеют разные результаты. Я пропустил что-то важное здесь?

ответ

5

Запятая разделяет элементы списка, а | отделяет головку списка от его хвоста. [X,[]] - это список из двух элементов, X и пустой список []. Но [X|[]] - это список одного элемента, X, с пустым хвостом.

Кстати, вы можете просто использовать lists:last/1 вместо того, чтобы писать свою собственную функцию.

+0

Спасибо за совет. Я делаю это, потому что думаю, что писать собственные функции я бы лучше тренировал свои навыки. Кроме того, могу ли я спросить, что о 'last ([X]) -> X'? Работает ли он так же, как 'last [X | []]'? – maoyi

+0

Да. Вы можете проверить это, если вы войдете в оболочку Erlang и введите следующее: '[1] = [1 | []].' (Здесь я решил использовать значение '1', но вы можете использовать любое значение, если оно то же самое с обеих сторон '='). Это похоже на утверждение, в котором указано, что '[1]' является совпадением для '[1 | []]'. Результат показывает, что это правда; если бы они не совпадали, вместо этого мы получили бы исключение «badmatch». –

+1

@ user2129773 Что касается '[1] = [1 | []]', вы можете найти некоторую справочную информацию о идее «списков минусов». Оборудовавшись некоторыми базовыми знаниями, вы начнете распознавать эти структуры по всему месту, одетым в различные синтаксисы на разных языках: https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html – zxq9

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