<div dir="ltr">It is definitely a public feature of list comprehensions. Maybe a pull request should be sent to <a href="http://www.erlang.org/doc/programming_examples/list_comprehensions.html">the list comprehensions page</a> updating the docs and adding nice examples? :)</div>

<div class="gmail_extra"><br clear="all"><div><div><br></div><div><br></div><div><span style="font-size:13px"><div><span style="font-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><b>José Valim</b></span></div>

<div><span style="font-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><div><span style="font-family:verdana,sans-serif;font-size:x-small"><a href="http://www.plataformatec.com.br/" style="color:rgb(42,93,176)" target="_blank">www.plataformatec.com.br</a></span></div>

<div><span style="font-family:verdana,sans-serif;font-size:x-small">Skype: jv.ptec</span></div><div><span style="font-family:verdana,sans-serif;font-size:x-small">Founder and Lead Developer</span></div></span></div></span></div>

</div>
<br><br><div class="gmail_quote">On Thu, Jan 16, 2014 at 5:39 PM, Rich Neswold <span dir="ltr"><<a href="mailto:rich.neswold@gmail.com" target="_blank">rich.neswold@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Hello,<br>
<br>
This morning I became aware of a (powerful) feature of list<br>
comprehensions. Take the following example:<br>
<br>
    [ X + Y || {X, Y} <- L].<br>
<br>
If we set L to [{1,2}, ok, {1,3}], we get the result [3,4] instead of<br>
a pattern match exception (as I was expecting.) This means that list<br>
comprehensions give you a "free" lists:filter/2 in the generator<br>
expressions!<br>
<br>
I've looked through the OTP documentation, quite a few Stack Overflow<br>
questions, and several list comprehension tutorials and none of them<br>
explicitly state that generator expressions filter elements that don't<br>
match their pattern. The web pages emphasize generators and guards are<br>
like combinations of lists:map and lists:filter, which isn't exactly<br>
correct. For instance, the above example is not the same as:<br>
<br>
    lists:map(fun ({X, Y}) -> X + Y end, L).<br>
<br>
but is more equivalent to:<br>
<br>
    lists:foldr(fun ({X, Y}, Acc) -> [X + Y | Acc];<br>
                    (_, Acc) -> Acc<br>
                end, [], L).<br>
<br>
Is this an expected, but undocumented, feature of list comprehensions?<br>
Or am I in "undefined behavior" territory?<br>
<br>
--<br>
Rich<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br></div>