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

Erlang 为什么函数参数中没有动态位模式?,erlang,binary,pattern-matching,bits,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,)-> %十,。 测试(P,X)-> =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,X)->
=X,
Y
在编译注释掉的
test/2版本时,我收到一个投诉,“变量'p'未绑定”。

是否有充分的理由不允许第一个版本与第二个版本工作相同?

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

在从句模式匹配中,你要问的问题是“这是我的从句吗”-你不能“跳进从句”,如果不是的话就退出


在第二个示例中,X在匹配之前绑定,您承诺进入子句,如果
不匹配X
,那么崩溃时间

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

这意味着在第一个示例中,当计算第二个参数时,p将被解除绑定,这违反了模式匹配的规则。相比之下,在第二个示例中,在计算二进制文件上的模式匹配时,P是有界的