Erlang中的模式匹配

Erlang中的模式匹配,erlang,pattern-matching,Erlang,Pattern Matching,我正试图学习一些Erlang,但我被困在这几个Erlang模式匹配问题上。 鉴于此处的模块: -模块(p1)。 -出口([f2/1])。 f2([A1,A2 | A1])->{A2,A1}; f2([A,真| B])->{A,B}; f2([A1,A2 | |])->{A1,A2}; f2([u124; B])->[B]; f2([A])->{A}; f2()->没有匹配项。 当我执行p1:f2([x])时,我收到一个空列表,它是[]。我以为它和第五条相符?文字也可以是原子吗 当我执行p1:f

我正试图学习一些Erlang,但我被困在这几个Erlang模式匹配问题上。 鉴于此处的模块:

-模块(p1)。
-出口([f2/1])。
f2([A1,A2 | A1])->{A2,A1};
f2([A,真| B])->{A,B};
f2([A1,A2 | |])->{A1,A2};
f2([u124; B])->[B];
f2([A])->{A};
f2()->没有匹配项。
当我执行
p1:f2([x])
时,我收到一个空列表,它是
[]
。我以为它和第五条相符?文字也可以是原子吗

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


同样,当我执行
p1:f2([2,7 div 3>2 |[5,3]])
时,它的计算结果是
(2,false)
。我的意思是为什么
7div3>2
会变成false?在其他语言中,如C或Java,是的,我知道
7div3==2
,所以这条语句是错误的。但在Erlang也一样吗?因为我刚刚在shell上试过,它给我的
2.3333333..
2
大,所以它会使这句话成为事实。有人能解释一下吗?

首先,
7第3部分是2。2不大于2,等于


其次,
[x,y]=[x |[y]]
,因为右侧(或其余)部分始终是一个列表。这就是为什么你会在第一个子句中出现。

这是因为
[x]
等于
[x |[]]
,所以它匹配
f2([[u124; B])->[B]。您可以在您的案例中看到
B=[]


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

在shell中您可能键入了7/3,这是浮点除法
div
rem
仅适用于并返回整数。@ukaszptaszynski是的,你是对的!我真的认为
/
操作与
div
做的事情是一样的,但是看起来数字类型之间肯定有区别!实际上,我只是想做一些Erlang练习来了解更多的模式匹配。因此,这些只是一些例子,它们并不是真正的目标:)