<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 31, 2015 at 3:11 PM, Roelof Wobben <span dir="ltr"><<a href="mailto:r.wobben@home.nl" target="_blank">r.wobben@home.nl</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div id=":14b" class="a3s" style="overflow:hidden">match_key( Key, [Head | Tail], List ) -><br>
  case element(1, Head) of<br>
    Key -> match_key(Key, Tail, [element(2,Head) | List] );<br>
    _ -> match_key(Key, Tail,  List )<br>
   end.<br></div></blockquote></div><br>This is a very imperative solution to the matcher. If you have a tuple, T = {X, Y} you can use element(1, T) and element(2, T) to project the X and Y elements "out of" the tuple. The equation rule is:</div><div class="gmail_extra"><br></div><div class="gmail_extra">T = {element(1, T), element(2, T)},</div><div class="gmail_extra"><br></div><div class="gmail_extra">That is, if we split the tuple and reform it, we obtain the same tuple again.</div><div class="gmail_extra"><br></div><div class="gmail_extra">But there is another semantics possible, namely matching. Most main-stream languages did not add this form since it was not commonly known at the time, but for some problems, it is a far more succinct:</div><div class="gmail_extra"><br></div><div class="gmail_extra">T = case T of {X, Y} -> {X, Y} end,</div><div class="gmail_extra"><br></div><div class="gmail_extra">which, we can use to rewrite the code:</div><div class="gmail_extra"><br></div><div class="gmail_extra">match_key(K, [H|T], L) -></div><div class="gmail_extra">  case H of</div><div class="gmail_extra">    {K, V} -> match_key(K, T, [V | L]);</div><div class="gmail_extra">    _ -> match_key(Key, T, L)</div><div class="gmail_extra">  end.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Note how this is more direct[0], since we don't have to worry about projecting out of `Head` anymore. We simply match on H and depending on the match, we do the right thing. If the key matches, then the value, V, is already deconstructed, so we can avoid having to write that.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Now, we can refactor some more. The match can be carried out at the top level of the function:</div><div class="gmail_extra"><br></div><div class="gmail_extra">match_key(_K, [], L) -> L;</div><div class="gmail_extra">match_key(K, [{K, V} | T], L) -> match_key(K, T, [V | L]);</div><div class="gmail_extra">match_key(K, [_ | T], L) -> match_key(K, T, L).</div><div class="gmail_extra"><br></div><div class="gmail_extra">which should remove a lot of clutter and make the function operate on the structure of the 2nd argument directly.</div><div class="gmail_extra"><br></div><div class="gmail_extra">[0] It avoids what is called boolean blindness.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">J.</div>
</div></div>