Почему эти списки не эквивалентны в Erlang - PullRequest
2 голосов
/ 06 июля 2019

Я пытаюсь понять использование | в Erlang, более конкретно, почему это выражение не эквивалентно:

[4,5,6|7]=:=[4,5,6,7]

Не используется ли символ |только для сопоставления с образцом, просто чтобы разбить список, чтобы соответствовать ему?

Ответы [ 3 ]

8 голосов
/ 06 июля 2019

Труба | для создания правильного списка необходим список с правой стороны. К этой правой стороне труба добавляет элементы с левой стороны. Итак, чтобы создать [4, 5, 6, 7] с нужной вам трубой

[4, 5, 6 | [7]]

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

7 голосов
/ 06 июля 2019

Разве не | символ, используемый только для сопоставления с образцом.

Нет, оператор cons (конструктор), |, можно использовать как для деконструкции списка с сопоставлением с образцом, так и для построения списка. Часто последняя строка функции будет:

 my_func(tail, [Head|Acc])

В этой строке оператор cons создает список для второго аргумента. Второй аргумент - это список, который добавляет содержимое переменной Head в начало списка Acc.

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

-module(a).
-compile(export_all).

get_evens(List) -> 
    get_evens(List, []). %% Add an empty list to the function call to accumulate the results.

get_evens([Head|Tail], Acc) when Head rem 2 == 0 ->  %% deconstruct the first argument into Head and Tail
    get_evens(Tail, [Head|Acc]);  %% construct the second argument for the get_evens() function call
get_evens([_Head|Tail], Acc) ->
    get_evens(Tail, Acc);
get_evens([], Acc) ->
    lists:reverse(Acc).

В оболочке:

2> c(a).
{ok,a}

3> a:get_evens([1, 2, 3, 4, 5]).
[2,4]

4> 

Единственная причина, по которой мы можем написать рекурсивные функции, которые заканчиваются, когда найден пустой список, состоит в том, что список можно определить так:

4> [1|[2|[3|[4|[5|[]]]]]].
[1,2,3,4,5]

Заметьте, как 5 сопоставляется с пустым списком: 5|[]? Это означает, что когда вы доберетесь до конца списка, [LastElmt | Tail] будет соответствовать LastElmt до 5 и Tail до [], что означает, что мы можем сопоставить другое предложение функции при вызове get_evens(Tail, Acc), например :

get_evens([], Acc) ->
    lists:reverse(Acc).
0 голосов
/ 18 июля 2019

Не связано с использованием |, но связано с вашим вопросом о сопоставлении с образцом. = используется для присвоения, но поскольку данные неизменны в эрланге, это также базовое сопоставление с образцом и проверка на эквивалентность.

Оператор соответствия = в шаблонах

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