Erlang中的模式匹配
我正试图学习一些Erlang,但我被困在这几个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
-模块(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练习来了解更多的模式匹配。因此,这些只是一些例子,它们并不是真正的目标:)