我正在 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'未绑定”。有什么好的理由不允许第一个版本与第二个版本一样工作吗?
我正在 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'未绑定”。有什么好的理由不允许第一个版本与第二个版本一样工作吗?
因为在注释掉的版本中 P 是一个长度 - 为了使它工作,Erlang 需要执行双重匹配 - 将第二个参数的值与未确定的模式匹配......
您在子句模式匹配中提出的问题是“这是我的子句吗”-您不能“弹出子句”然后退出,如果不是...
在第二个示例中,X 在匹配之前绑定,您承诺进入子句和 if <<Y:P,0:1>> don't match X
,那么崩溃时间!
原因是函数的参数是独立评估的。绑定到变量的正确性仅作为第二步进行检查。
这意味着在您的第一个示例中, P 在评估第二个参数时将不受约束,这违反了模式匹配规则。相反,在您的第二个示例中, P 在评估二进制文件的模式匹配时被绑定。