【发布时间】:2015-01-12 00:07:39
【问题描述】:
我最近开始学习Erlang,在尝试pattren match时遇到以下错误
以下表达式工作正常:
{A,_,[B|_],{B}}={abc,23,[22,x],{22}}.
Resulting in
A = abc
B = 22
以下表达式不起作用:
{A,_,[_|B],{B}}={abc,23,[22,x],{x}}.
Is resulting in
** exception error: no match of right hand side value {abc,23,[22,x],{x}}
但是,如果我将 [22 , x 中的“,”替换为 |如下所示,它的工作查找并将 x 绑定到 B
{A,_,[_|B],{B}}={abc,23,[22|x],{x}}.
{abc,23,[22|x],{x}}
B.
x
对此的任何解释将不胜感激。
提前非常感谢
【问题讨论】:
-
[_|Whatever] 的字面意思是anything,所以它不能被匹配,因为
_可以消费/匹配任何东西,包括匹配的整个元素.这意味着“任何东西,然后是Whatever——我们在这里没有定义”。[22|Whatever]或任何[FiniteThing|_]表示“具体和有限的东西,然后是Whatever”,可以匹配,因为它可以完全匹配和消耗列表的第一部分。 IOW,“任何东西”匹配/消耗所有东西,而具体和有限的东西只能代表它自己。