Минусы Оператор "|" В эрланге - PullRequest
3 голосов
/ 22 декабря 2011

Читая LearnYouSomeErlang, я обнаружил, что оператор cons используется для получения первого элемента списка.Меня немного смутило, как это работает, потому что ранее в книге он упоминал, что оператор cons используется для добавления элементов в список.

Эта функция возвращает первый элемент списка.*

Найдено на этой странице http://learnyousomeerlang.com/syntax-in-functions.

Может кто-нибудь объяснить, как это работает при возврате первого элемента списка.

Ответы [ 2 ]

9 голосов
/ 22 декабря 2011

Оператор cons может использоваться для сопоставления с шаблоном списка. Таким образом, список может быть сопоставлен с шаблоном [H|T], который деконструирует список, и H является первым элементом списка, а T является остальными элементами списка.

Итак, оператор cons используется как для сопоставления с образцом, так и для создания списков. Например, строительство составляет X = [1|[2,3]].

5 голосов
/ 23 декабря 2011

Я не уверен, будет ли это полезно, но ...

A cons cell описывает пару, первый элемент которых является каким-то термином, а второйуказатель на другую ячейку cons (или нуль, если в конце списка).Так что, если вы позволите мне использовать «->» в качестве символа указателя, простой cons-ячейкой, представляющей список из одного элемента, может быть

[1, -> null] = the list [1]. 

[2, -> [1,-> null]] = the list [2,1], etc.

Список можно рассматривать как связанный списокcons-ячейки, где 2-й элемент в ячейке Cons - указатель на следующую ссылку.

Оператор Cons создает новый список, создавая ячейку Cons, первый элемент которой является новым элементом списка, а второй -является указателем на первую ячейку Cons исходного списка.Первым элементом является голова, а вторым элементом (хвостом) является указатель на следующую ячейку Cons в «цепочке».В Erlang вышеприведенное может быть записано как

[2 | [1 | []]]

, который является списком [2,1].Как сокращение, [1 | []] записывается как [1], поэтому

 [2|[1|[]]] = [2|[1]]=[2,1]

Теперь, если бы мой список был [1,2,3], я мог бы представить его как его головуЗакончено с его хвостом, как в,

[1|[2,3] 

Так, поскольку Erlang является удивительным, этот шаблон доступен для соответствия как в: «У меня есть список, [1,2,3], который можетбыть описанным как Cons-ed Hd и Tail (указатель на Hd остальной части списка). Так что

[Hd|Tail] = [1,2,3] 

дает

Hd = 1 

и

Tail = [2,->[3,->null]] = [2|[3|[]]] = [2|[3]] = [2,3].
...