Что такое сопоставление с образцом в Эрланге - PullRequest
0 голосов
/ 12 апреля 2019

Я изучаю Erlang и наткнулся на Pattern Matching.

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

Объяснение, в котором любой может понять.

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

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

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

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

 {Y, 10} = {20, 10}

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

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

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

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

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) Ситуации, списки и т. Д.

0 голосов
/ 24 апреля 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

...