Что такое сопоставление с образцом в Erlang

Я изучаю Erlang и наткнулся на сопоставление с образцом.

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

Объяснение, понятное любому.

Я прочитал несколько источников, но все еще не могу понять концепцию.


person septiczz    schedule 12.04.2019    source источник
comment
Сожалеем, что за ваше сообщение проголосовали против, потому что SO установила стандарт качества вопросов. См. Этот документ stackoverflow.com/help/how-to-ask   -  person Anthony Kong    schedule 14.04.2019
comment
В качестве своего вопроса вы можете проверить этот документ erlang: erlang.org/doc/reference_manual/patterns.html   -  person Anthony Kong    schedule 14.04.2019


Ответы (2)


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

Сопоставление с образцом - это то, как инициируется присваивание в erlang. В других языках знак = является оператором присваивания, например x = 10. Однако в erlang знак = - это оператор сопоставления с шаблоном. Когда erlang видит знак =, он смотрит на член справа от знака =, затем пытается присвоить значения переменным слева от знака равенства, так что обе стороны знака = идентичны. , т.е. они совпадают.

В простом случае, например, X = 1, похоже, знак = выполняет присваивание в erlang. Фактически, X будет иметь значение 1 после оценки этого оператора. Однако на других языках нельзя написать следующее:

 {Y, 10} = {20, 10}

В других языках у вас не может быть констант в левой части оператора присваивания. Однако в erlang указание констант слева от оператора сопоставления с шаблоном совершенно нормально. После оценки этого оператора Y будет иметь значение 20, потому что для того, чтобы обе стороны знака = были идентичными, erlang должен присвоить Y значение 20.

Как Erlang выполняет это задание? На самом деле это не имеет значения, но вы можете думать об операторе присваивания в erlang как о трех символах !*!. Когда erlang видит оператор сопоставления с образцом в приведенном выше примере, чтобы добиться совпадения, erlang использует оператор присваивания !*! для присвоения значения 20 Y, то есть Y !*! 20.

Когда вы пишете = на эрланге, вы спрашиваете: «Пожалуйста, постарайтесь, чтобы эти вещи совпадали!». Эффект заключается в том, что erlang выполнит некоторые присваивания (!*!), чтобы обе стороны совпадали. Вы не можете выполнять присваивание напрямую самостоятельно, все, что вы можете сделать, это попросить erlang привести все в соответствие. Если это слишком сбивает с толку, просто подумайте об операторе сопоставления с образцом как о трюковом операторе присваивания, который более мощный, чем оператор присваивания в других языках. Неважно, как вы называете = вход в erlang, вам просто нужно знать, как это работает.

В erlang сопоставление с образцом можно использовать по-разному:

1) Чтобы извлечь позиционные значения из структуры данных:

15> [X, {Y, _}] = [10, {1, hello}].
[10,{1,hello}]

16> X.
10

17> Y.
1

2) Чтобы определить, какое предложение функции выполняется в определении функции:

my.erl:

    go(X, hello) ->
        io:format("Do stuff: ~w~n", [X*2]);
    go(X, goodbye) ->
        io:format("Do other stuff: ~w~n", [X-2]);
    go(_, _) ->
        io:format("Okay.~n").

В оболочке:

7> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

8> my:go(3, 4).  
Okay
ok

9> my:go(2, goodbye).
Do other stuff: 0
ok

10> my:go(10, hello).
Do stuff: 20
ok

При первом вызове функции erlang выполняет следующее сопоставление с образцом:

{X, hello} = {3, 4}

... что не удается, потому что никакое значение, которое erlang может присвоить (!*!) X, не приведет к совпадению обеих сторон. Итак, erlang переходит к следующему предложению функции и выполняет сопоставление:

{X, goodbye} = {3, 4}

что тоже терпит неудачу; наконец, третье предложение функции совпадает, поэтому операторы в теле этого предложения функции выполняются.

3) Регистр, составление списков и т. д.

person 7stud    schedule 27.04.2019

Рассмотрим этот пример сопоставления с образцом в функции:

Eshell V8.2.1  (abort with ^G)
1> F = fun(1, X) -> "hello f1";
1>        (2, X) -> "hello f2"
1>     end.
#Fun<erl_eval.12.52032458>
2> F(1, 33).
"hello f1"
3> F(2, some_token).
"hello f2"
4> F(3, "...").     
** exception error: no function clause matching erl_eval:'-inside-an-interpreted-fun-'(3,"...") 
5> 

Сопоставление с образцом по первому аргументу функции F позволяет выполнить ту или иную ветвь кода.

Сопоставление с образцом - это способ:

  • гарантировать выполнение некоторых условий
  • пусть код попадает в определенные ветки (например, if-then-else)
  • вызвать ошибку, если путь выполнения недействителен

См. Также страницу официальной документации: http://erlang.org/doc/reference_manual/patterns.html

person user803422    schedule 24.04.2019