2014-11-08 103 views
-1

林学二郎 假设我有两个列表二郎列表元组匹配

[{a,a,a,b,c},{d,d,a,a,b},{a,b,c,d,e}] 
[{{a,a,a,a,a},10},{{a,a,a,a},6},{{a,a,a},4}] 

彭定康比赛结束后,预期的结果{A,A,A,B,C},因为它可以匹配{{A,A,一},4}

我试图列表:keysearch列表:成员,但不能得到预期的结果

什么建议吗?

谢谢

+0

“{a,a,a,b,c}”与“{{a,a,a},4}'匹配?你能解释一下这两者是怎么样的? – mpm 2014-11-08 22:37:42

+0

谢谢你的回复。我想匹配{a,a,a | _} {a,a,a,b,c}。这可能吗? – user3644708 2014-11-08 22:45:18

+0

还不确定。为什么'{a,a,a,b,c}'不匹配'{{a,a,a,a,a},10}'?元组通常代表某种完整的连接数据;如果您只想使用其中的一部分,也许尝试将其表示为列表?对于我来说,如果我真的不明白你想表达什么,那么很难想出通用算法。也许试图描述你的匹配背后的逻辑,你从哪里获得输入,以及你将在哪里使用你的输出。这可能对我有所帮助。 – mpm 2014-11-08 23:24:04

回答

2

匹配不消耗。你的心理模型如何匹配工作是令人困惑的设置操作(如设置减法和交集)与比较和分配。您的设置操作的概念也可能从一些评论中受益。

Erlang的匹配是只有赋值和断言(一种比较)。如果我们反对任何值相匹配的绑定变量(从来没有使用之前),变量会绑定(分配),其值:

Foo = {a,b,c}. 

现在Foo{a,b,c}可以互换使用。这是像数学类一样的纯符号分配,而不是其他语言中变量是“值的存储框”的意义上的“变量”。

如果我们使用=运算符对任何值和现在绑定的符号Foo,我们将执行检查比较(断言)而不是赋值。 Foo不能意味着比在目前情况下{a,b,c}其他任何东西,所以想给它分配任何不同的值造成了一个例外,而只是指出{a,b,c}{a.b.c}是正确的,仍然产生{a,b,c}(既然Foo现在是一个符号{a,b,c}它可以出现在任何一方,但声明仍然正确)。

{a,b,c} = {a,b,c}. 

{a,b,c} = Foo. 

Foo = {a,b,c}. 

回报{a,b,c},并没有引发异常,因为所有我们在这里所做的就是断言{a,b,c}确实{a,b,c}

如果我想分配仅仅是第一价值,我可以搭配另一种方式:

{Bar,_,_} = {a,b,c}. 

现在Bar代表a_值将被忽略(完全跳过)。原{a,b,c}没有改变。这也是真实的,如果我们这样做:

{_,Baz,_} = Foo. 

现在Baz代表b,并Foo仍然是{a,b,c}。这就是它。当涉及到列表,像[{a,b,c}, {1,2,3}]我们仍然可以做配套,但由于清单的性质,我们将在一个时间(试试这个解释器中)检查了一块:

Spam = [{a,b,c}, {1,2,3}]. 
[Boo | _] = [{a,b,c}, {1,2,3}]. 

现在Boo代表{a,b,c},和Spam仍然代表其原始列表。

这就是关于所有匹配。关于Erlang模式匹配的神奇之处不在于它是如何工作的,它有多少地方为模式匹配提供了天然的机会,以及它如何自然地解决了大量需要程序检查或其他语言中的直接分配操作的问题(cond,功能参数,=,消息接收等)。

设置和列表操作与Erlang中的模式匹配不同。我建议首先阅读一些基本的学习材料,例如许多优秀的初学者教程和Learn You Some Erlang

+0

谢谢你的回答。随时编辑问题。 – user3644708 2014-11-11 12:31:37