关于模式匹配的基本问题

时间:2011-02-21 11:06:47

标签: erlang pattern-matching

我注意到[H|T] = [1].成功但[H|T] = [].失败。我猜这就是它的工作原理,但有没有理由设计师没有选择让这种模式匹配成功并导致H=[]T=[]的分配?

9> [H|T] = [1].
[1]
10> H.
1
11> T.
[]
12> [H|T] = [].
** exception error: no match of right hand side value []

2 个答案:

答案 0 :(得分:11)

如果[H|T][]匹配H=T=[],那么使用模式匹配[[]]将无法与[]区分开来。

此外,模式[][H|T]将不再相互排斥,因此如果您在递归函数中首先意外匹配[H|T],那么[]是基本情况,你会导致无限递归。

同样使用[]作为“此列表没有头部”的符号似乎很随意,可能会让很多用户感到惊讶。

答案 1 :(得分:0)

虽然@ sepp2k所说的是正确的,[]不匹配[_|_]的一个更根本的原因是它们是不同的数据类型,所以不应该匹配。它会打败模式匹配点。