答えは、タプルを使用するときに二重中括弧を使用することだと思います ( http://www.erlang.org/doc/apps/erts/match_spec.html#id69408の変数とリテラルのセクションを参照してください)。したがって、matchspec 式でタプルを使用するには、次のようにタプルを中かっこで囲みます。
{'==','$2',{{1,2}}}
したがって、あなたの例を正しく理解していれば、
22> M=[{{'_','$1','$2'},[{'==','$2',{{1,2}}}],['$_']}].
[{{'_','$1','$2'},[{'==','$2',{{1,2}}}],['$_']}]
23> ets:match_spec_run([{1,1,{1,2}}],ets:match_spec_compile(M)).
[{1,1,{1,2}}]
24> ets:match_spec_run([{1,1,{2,2}}],ets:match_spec_compile(M)).
[]
編集:(回答を編集して申し訳ありませんが、これが私のコメントを読みやすい形式で取得する最も簡単な方法でした)はい、これが行われなければならない方法です。match-spec を取得する簡単な方法は、リテラルfun を引数としてets:fun2ms/1
取り、match-spec を返す(疑似) 関数を使用することです。そう
10> ets:fun2ms(fun ({A,B,C}=X) when C == {1,2} -> X end).
[{{'$1','$2','$3'},[{'==','$3',{{1,2}}}],['$_']}]
シェルは を認識しets:fun2ms/1
ます。詳細については、ETS のドキュメントを参照してください。Mnesia は ETS と同じ match-spec を使用します。