3

我正在 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'未绑定”。有什么好的理由不允许第一个版本与第二个版本一样工作吗?

4

2 回答 2

4

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

您在子句模式匹配中提出的问题是“这是我的子句吗”-您不能“弹出子句”然后退出,如果不是...

在第二个示例中,X 在匹配之前绑定,您承诺进入子句和 if <<Y:P,0:1>> don't match X,那么崩溃时间!

于 2009-04-18T16:15:11.653 回答
0

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

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

于 2009-09-26T11:35:42.690 回答