我正在努力学习一些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
所以它会使这个陈述成立。有人可以解释一下吗?
答案 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]
会。