什么是Erlang模式匹配

时间:2019-04-12 19:06:28

标签: erlang erlang-shell

我正在学习Erlang,并遇到了模式匹配。

有人可以用简单的解释向我解释什么是模式匹配。

任何人都可以理解的解释。

我已经阅读了多个资料,但是仍然无法理解这个概念。

2 个答案:

答案 0 :(得分:0)

在函数中考虑此模式匹配的示例:

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

答案 1 :(得分:0)

  

有人可以用一个好心的告诉我什么是模式匹配   简单的解释。任何人都可以理解的解释。

模式匹配是在erlang中激励的方式。在其他语言中,=符号是赋值运算符,例如x = 10。但是,在erlang中,=符号是 模式匹配运算符 。当erlang看到=符号时,它会查看=符号右侧的项,然后尝试将值赋给等号左侧的变量,以便=符号的两边相同,即它们匹配。

在简单的情况下,例如X = 1,看起来=符号在erlang中执行赋值。实际上,在评估该语句之后,X的值为1。但是,您不能用其他语言编写以下内容:

 {Y, 10} = {20, 10}

在其他语言中,赋值运算符的左侧不能包含常量。但是,在erlang中,在 模式匹配运算符 的左侧指定常量是完全正常的。对该语句求值后,Y将具有值20,因为为了使=符号的两侧相同,erlang必须将值20分配给Y。

erlang如何执行该任务?没关系,但是您可以将erlang中的赋值运算符视为三个字符!*!。当erlang在上面的示例中看到模式匹配运算符时,为了使事物匹配,erlang使用赋值运算符!*!来将值20赋给Y,即{{ 1}}。

在用erlang编写Y !*! 20时,您会问:“请尝试使这些内容匹配!”。连锁效应是erlang将执行一些分配(=)以使双方匹配。您不能自己直接进行分配,您所能做的就是要求erlang使事情匹配。如果这太令人困惑,则只需将 pattern match运算符视为 trick赋值运算符,它比其他语言中的赋值运算符功能更强大。不论您在erlang中叫什么!*!都没关系,您只需要知道它的工作方式即可。

在erlang中,模式匹配可以通过多种不同方式使用:

1)要从数据结构中提取位置值:

=

2)要确定哪个函数子句在函数定义中执行:

my.erl:

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

16> X.
10

17> Y.
1

在外壳中:

    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").

在第一个函数调用中,erlang执行以下模式匹配:

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

也失败;最后第三个function子句匹配,因此该function子句的主体中的语句将执行。

3)案例陈述,列表理解等