Erlang中的模式匹配

时间:2014-12-10 17:46:52

标签: erlang pattern-matching

我正在努力学习一些Erlang,而我却遇到了几个Erlang模式匹配问题。 给出这里的模块:

-module(p1).
-export([f2/1]).

f2([A1, A2 | A1]) -> {A2, A1};
f2([A, true | B]) -> {A, B};
f2([A1, A2 | _]) -> {A1,A2}; 
f2([_|B]) -> [B];
f2([A]) -> {A}; 
f2(_) -> nothing_matched.

当我执行p1:f2([x])时,我收到一个空列表[]。我认为它符合第5条款?这个文字也可以是一个原子吗?

当我执行p1:f2([[a],[b], a])时,结果为([b], [a]),这意味着它与第一个子句匹配。但是我认为[a]和a不是一回事?一个是列表,但另一个是文字?

当我执行p1:f2([2, 7 div 3 > 2 | [5,3]])时,它的评估结果为(2, false)。我的意思是为什么7 div 3 > 2会变错?在其他语言如C或Java中,我知道7 div 3 == 2所以它使这个陈述成为假。但它在Erlang中是一样的吗?因为我只是在shell上尝试过它,它给我2.3333333..大于2所以它会使这个陈述成立。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

首先,7 div 3是2.而2不大于2,它是相等的。

其次,[x, y] = [x | [y] ],因为右边(或 rest )部分始终是一个列表。这就是你进入第一个条款的原因。

答案 1 :(得分:1)

这是因为[x]等于[x|[]]所以它匹配f2([_|B]) -> [B];。正如你所看到的那样B=[]

我认为你没有写下你想做的事情。在表达式[A|B]中,A是列表的第一个元素,而B是列表的其余部分(因此它是一个列表)。这意味着[1,2,1][A1, A2 | A1]不匹配;但是[[1],2,1][[a,b],1,a,b]会。