Erlang - 为什么这两个表达式不匹配?

时间:2014-03-01 20:54:46

标签: erlang

我有这个案例陈述:

case {[{atom1,A1},{atom2,A2}],false} of

                {[{A,B},{C,D}], false} -> {A,B}
            end.

还有其他情况,但我将它们删除了。

我不明白为什么会收到以下错误:

**异常错误:没有匹配{[{atom1,A1},{atom2,A2}],false}的case子句      在函数expr中:myFunct / 1(myModule.erl,第391行)

为什么{[{atom1,A1},{atom2,A2}],false}不等于{[{A,B},{C,D}],false}?

3 个答案:

答案 0 :(得分:2)

A子句时,BCDcase(或所有这些)之一可能已绑定到某个值模式匹配,与匹配时不一样。

为了匹配,必须满足以下条件,在模式匹配发生时:

  • A必须是未绑定的,否则必须包含值atom1
  • B必须是未绑定的,否则它必须包含与A1相同的值
  • C必须是未绑定的,否则必须包含值atom2
  • D必须是未绑定的,否则它必须包含与A2相同的值

答案 1 :(得分:1)

它是平等的。除非变量A或C已经绑定到某个值。

答案 2 :(得分:1)

确实如此。如果ABCD中至少有一个已经绑定了与之不匹配的值,则问题可能是您的周围代码。

$ erl
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.4  (abort with ^G)
1> A1 = foo, A2 = bar.
bar
2> case {[{atom1,A1},{atom2,A2}],false} of
2> 
2>                 {[{A,B},{C,D}], false} -> {A,B}
2>             end.
{atom1,foo}