<div dir="ltr"><div><div><div><div><div>The alternative notation is something along the lines of:<br><br>#{ ... }<br><br></div>which says that we have a map with at least one extra undefined element. In that case, the pattern<br><br></div>#{ a := _, ... }<br><br></div>would say "the key a MUST be present, I don't care about the value, and there MUST be additional elements in the map", whereas<br><br></div>#{ a := _ }<br><br></div>is *exactly* the one-element map. Too late for this notation though.<br></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Feb 7, 2017 at 3:48 PM Raimo Niskanen <<a href="mailto:raimo%2Berlang-questions@erix.ericsson.se">raimo+erlang-questions@erix.ericsson.se</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Tue, Feb 07, 2017 at 12:45:15PM +0100, Joe Armstrong wrote:<br class="gmail_msg">
> Ten minutes ago I was happily recursing down a list and discovered<br class="gmail_msg">
> to my horror that an empty map isn't an empty map.<br class="gmail_msg">
><br class="gmail_msg">
> 1> #{} = #{a => 1}.<br class="gmail_msg">
> #{a => 1}<br class="gmail_msg">
><br class="gmail_msg">
> The documentation actually says:<br class="gmail_msg">
><br class="gmail_msg">
> <quote><br class="gmail_msg">
> #{} = Expr<br class="gmail_msg">
><br class="gmail_msg">
> This expression matches if the expression Expr is of type map,<br class="gmail_msg">
> otherwise it fails with an exception badmatch.<br class="gmail_msg">
> </quote><br class="gmail_msg">
><br class="gmail_msg">
> So #{} is an empty map in an argument position but not an empty map<br class="gmail_msg">
> in a pattern.<br class="gmail_msg">
><br class="gmail_msg">
> So this is not a bug since the system does what the documentation says<br class="gmail_msg">
> but it is very weird.<br class="gmail_msg">
><br class="gmail_msg">
> Is there some deep reason for this that I've missed ??????<br class="gmail_msg">
><br class="gmail_msg">
> Very Puzzled<br class="gmail_msg">
<br class="gmail_msg">
I think it is quite logical since #{a := _} in a match position matches a<br class="gmail_msg">
map with a key 'a' plus any number of other keys in it, so why should not<br class="gmail_msg">
the empty map #{} in a match position also match any number of other keys<br class="gmail_msg">
in it?<br class="gmail_msg">
<br class="gmail_msg">
><br class="gmail_msg">
> /Joe<br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
<br class="gmail_msg">
/ Raimo Niskanen, Erlang/OTP, Ericsson AB<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
erlang-questions mailing list<br class="gmail_msg">
<a href="mailto:erlang-questions@erlang.org" class="gmail_msg" target="_blank">erlang-questions@erlang.org</a><br class="gmail_msg">
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" class="gmail_msg" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br class="gmail_msg">
</blockquote></div>