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'はバインドされていません」という苦情が表示されます。最初のバージョンが2番目のバージョンと同じように機能しないようにする正当な理由はありますか?

4

2 に答える 2

4

コメントアウトされたバージョンでは P は長さであるため、Erlang が機能するには二重一致を実行する必要があります。2 番目のパラメーターの値を未決定のパターンと一致させます...

句のパターン マッチで尋ねている質問は、「これは私にとっての句ですか」です。「句に飛び込む」ことはできません。

2 番目の例では、マッチの前に X がバインドされています。句に入ることが約束されており、if<<Y:P,0:1>> don't match Xはクラッシュ タイムです。

于 2009-04-18T16:15:11.653 に答える
0

その理由は、関数への引数が互いに独立して評価されるためです。変数へのバインドの正確性は、2 番目のステップとしてのみチェックされます。

これは、最初の例では、2 番目の引数を評価するときに P がバインドされないことを意味します。これは、パターン マッチングの規則に反します。対照的に、2 番目の例では、バイナリのパターン マッチを評価するときに P がバインドされます。

于 2009-09-26T11:35:42.690 に答える