为什么函数参数中没有动态位模式?

时间:2009-04-18 12:06:18

标签: erlang binary pattern-matching bits

我正在试验Erlang中的位模式匹配:

-module(test).
-export([test/2]).

%test(P,<<X:P,0:1>>) ->
%    X.

test(P,X) ->
    <<Y:P,0:1>> = X,
    Y.

在编译test/2的注释版本时,我会收到“变量'P'未绑定”的投诉。 是否有任何理由不允许第一个版本与第二个版本一样工作?

2 个答案:

答案 0 :(得分:4)

因为在注释掉的版本中P是一个长度 - 为了工作,Erlang需要执行双重匹配 - 将第二个参数的值与未确定的模式匹配...

你在条款模式匹配中提出的问题是“这是我的条款” - 你不能“弹入条款”然后退出,如果它不是......

在第二个示例中,X在匹配之前绑定,您承诺进入该子句,如果<<Y:P,0:1>> don't match X,则崩溃时间很短!

答案 1 :(得分:0)

原因是函数的参数是相互独立的。绑定到变量的正确性仅作为第二步检查。

这意味着在第一个示例中,在评估第二个参数时,P将被解除绑定,这违反了模式匹配的规则。相反,在第二个示例中,P在评估二进制文件匹配时绑定。