[erlang-questions] Why does fun2ms produce this particular result?

Daniel Dormont <>
Wed May 4 05:18:36 CEST 2011

Thanks, let me summarize to see if this is correct:

1) In general (though not in the case of ETS/Mnesia), the MatchBody might
contain actions to be performed before returning the final result. This is
why it's a list.
2) Actions may be specified in the form of a tuple, the first element of
which describes the action to be performed. Therefore, if you want to have
your "action" be a value which is itself a tuple, you have to wrap it in
another tuple.

Is this right? If so, I guess I understand what the rules are, but I'm still
not really clear on why, since it seems like dbg and ets are different
enough that you'd never really use the same kind of MatchSpec for both, so
there isn't much benefit in having the structure be compatible.


On Mon, May 2, 2011 at 2:35 AM, Mazen Harake <> wrote:

> Check out chapter 2 in my dbg tutorial, it describes matchspecs and how to
> use them. You will also understand what it is that fun2ms actually
> translates to.
> http://www.erlang-factory.com/conference/testingtutorialworkshop2010/speakers/MazenHarake
> Dbg matchspecs aren't exactly like the mnesia ones, there is a small
> difference but the concept is exactly the same.
> /M
> On 1 May 2011 21:06, Daniel Dormont <> wrote:
>> I'm trying to get the hang of match specs. Here's a pretty simple one but
>> it has a feature I'm not getting. It's intended for use with Mnesia:
>> 1> rd(person, {name, address, email, phone}).
>> person
>> 2> ets:fun2ms(fun(#person{name=Name, email=Email}) -> {Name, Email}
>> end).
>> [{#person{name = '$1',address = '_',email = '$2',
>>           phone = '_'},
>>   [],
>>   [{{'$1','$2'}}]}]
>> My first question was going to be why the whole thing is a single-element
>> list, but I think I figured that out: it's because there could be multiple
>> clauses of the match as a whole. The part I don't get is in the result:
>> [{{'$1','$2'}}]
>> 1) Why is it a list at all, since a particular head in the function can
>> only have one result?
>> 2) Why does the tuple have to be wrapped in another tuple? ie why isn't it
>> just {'$1','$2'}
>> For now I'm happy to just trust that fun2ms works, but I'd like to
>> understand it a little better.
>> thanks,
>> Dan
>> _______________________________________________
>> erlang-questions mailing list
>> http://erlang.org/mailman/listinfo/erlang-questions
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20110503/c61060c1/attachment.html>

More information about the erlang-questions mailing list