我正在试验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'未绑定”的投诉。
是否有任何理由不允许第一个版本与第二个版本一样工作?
答案 0 :(得分:4)
因为在注释掉的版本中P是一个长度 - 为了工作,Erlang需要执行双重匹配 - 将第二个参数的值与未确定的模式匹配...
你在条款模式匹配中提出的问题是“这是我的条款” - 你不能“弹入条款”然后退出,如果它不是......
在第二个示例中,X在匹配之前绑定,您承诺进入该子句,如果<<Y:P,0:1>> don't match X
,则崩溃时间很短!
答案 1 :(得分:0)
原因是函数的参数是相互独立的。绑定到变量的正确性仅作为第二步检查。
这意味着在第一个示例中,在评估第二个参数时,P将被解除绑定,这违反了模式匹配的规则。相反,在第二个示例中,P在评估二进制文件匹配时绑定。