Erlang Список Создание - PullRequest
       3

Erlang Список Создание

1 голос
/ 28 февраля 2012

Почему следующие 2 выражения, которые могут создать список, возвращают разные результаты в Erlang?

> ["A" | []]
// returns ["A"]
> [[] | "A"]
// returns [[], 65]

Я ожидал, что второе выражение возвращает тот же результат, что и первое.Кто-нибудь может объяснить, почему это происходит?

Ответы [ 2 ]

8 голосов
/ 28 февраля 2012

Чтобы правильно понять, как это работает, имейте в виду, что все эти выражения следуют этой схеме:

[head | tail]

где head - один элемент, а tail - другой список.

Также обратите внимание, что строки представляют собой список символов, то есть "A" фактически равен [65].

Следовательно, в первом случае создается список с заголовком "A" и хвостом [], который, как и ожидалось, превращается в ["A"].

Однако во втором случае голова - [], а хвост - "A", что равно [65]. Следовательно, результатом является элемент head ([]) плюс все элементы в tail (65).

2 голосов
/ 28 февраля 2012

Я не понимаю, почему они должны быть одинаковыми.Вы можете подумать, что [A|B] объединяет списки A и B, но это не так: он предназначен для добавления элемента A к списку B.

["A" | []] - упорядоченная пара, у которой "A" в качестве первого элемента и [] в качестве второго, что соответствует списку с "A" в качестве одного элемента.

[[] | "A"] - упорядоченная пара с [] в качестве первого элемента и "A" в качестве второго;поскольку строка на самом деле является списком кодов ASCII в Erlang, это означает, что она такая же, как список, содержащий [] и 65 (ASCII A) в качестве своих элементов.Поскольку первый элемент списка сам по себе является списком, это вложенный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...