<div dir="ltr">Hi, <div><br></div><div>Wow.. after reading the blog's introduction, i realize, it turns out a very special beautiful function and it turns out R. Virding is a fans of this looks-simple-and-beautiful function hahaha. Wow it's amazing and looks great for me. </div><div><br></div><div>Thank you</div><div><br><br><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Pada tanggal Jum, 23 Agu 2019 pukul 21.39 Eckard Brauer <<a href="mailto:eckard.brauer@gmx.de">eckard.brauer@gmx.de</a>> menulis:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Nice explanation, thank you!<br>
<br>
For me, it helps to think of mathematical induction:<br>
<br>
First trying to get a model of the base case(s) - occasionally more<br>
than only one exist.<br>
<br>
After that I (try to) think of the step case - how to evolve from base<br>
or any given case to the next (more complex) one.<br>
<br>
The brilliance of the example is to show multiple conditions - one for<br>
head, one (dependent) for tail - are given the probably elegantest<br>
possible way.<br>
<br>
Eckard<br>
<br>
Am Fri, 23 Aug 2019 11:09:42 -0300<br>
schrieb Brujo Benavides <<a href="mailto:elbrujohalcon@gmail.com" target="_blank">elbrujohalcon@gmail.com</a>>:<br>
<br>
> Since I needed a bit more space to write an answer 🙄 I replied on my<br>
> blog<br>
> <<a href="https://medium.com/erlang-battleground/how-to-comprehend-comprehensions-c924f92a97e1?sk=b668da926f05b7293f34dafa48fa5654" rel="noreferrer" target="_blank">https://medium.com/erlang-battleground/how-to-comprehend-comprehensions-c924f92a97e1?sk=b668da926f05b7293f34dafa48fa5654</a>><br>
> 😉 Cheers :)<br>
> <br>
> Brujo Benavides <<a href="http://about.me/elbrujohalcon" rel="noreferrer" target="_blank">http://about.me/elbrujohalcon</a>><br>
> <br>
> <br>
> <br>
> > On 23 Aug 2019, at 10:47, Jesper Louis Andersen<br>
> > <<a href="mailto:jesper.louis.andersen@gmail.com" target="_blank">jesper.louis.andersen@gmail.com</a>> wrote:<br>
> > <br>
> > On Fri, Aug 23, 2019 at 2:03 PM I Gusti Ngurah Oka Prinarjaya<br>
> > <<a href="mailto:okaprinarjaya@gmail.com" target="_blank">okaprinarjaya@gmail.com</a> <mailto:<a href="mailto:okaprinarjaya@gmail.com" target="_blank">okaprinarjaya@gmail.com</a>>> wrote:<br>
> > Hi,<br>
> > <br>
> > Now I read Joe's book titled Programming Erlang 2nd Edition. I<br>
> > practice some functions such as for/3, quicksort/1, pythag/1, and<br>
> > perms/1, and perms/1 is the function that hard to understand.<br>
> > <br>
> > I understand comprehension lists, I fully understand for/3, I fully<br>
> > understand quicksort/1, pythag/1. But it's really hard for me to<br>
> > understand perms/1. Please teach me how to read and understand this<br>
> > perms/1 function.<br>
> > <br>
> > perms([]) -> [[]];<br>
> > perms(List) -> [ [H|T] || H <- List, T <- perms(List--[H]) ].<br>
> > <br>
> > <br>
> > Note you have two generators in the comprehension. So for each<br>
> > generated H, it generates all the possible T's. Also note that the<br>
> > T's depend on the H. It is akin to having a for-loop within a<br>
> > for-loop:<br>
> > <br>
> > for H := range(List) {<br>
> >   for T := perms(List -- [H]) {<br>
> >      Res := append(Res, [H|T])<br>
> >   }<br>
> > }<br>
> > <br>
> > Now, to understand why this works, the argument is based on an<br>
> > induction principle:<br>
> > <br>
> > Observe that to generate a permutation, you first select something<br>
> > which goes first, H, and then you need to generate a permutation<br>
> > out of the remaining elements, List -- [H]. Suppose we fix H to<br>
> > some value in the list. Then surely, we can generate all the<br>
> > permutations where H goes first, by generating perms(List - [H])<br>
> > and then attaching H to all the results:<br>
> > <br>
> > perms(List) -><br>
> >   H = pick_among(List),<br>
> >   [ [H|T] || T <- perms(List -- [H]) ].<br>
> > <br>
> > But now note that to generate all permutations, any element could<br>
> > have been picked by pick_among/1. So we need to loop over all<br>
> > elements in the list one at a time, and consider what happens if<br>
> > that element goes first. This is what the original code is doing.<br>
> > <br>
> > Alternative wordings by Sverker and Fred :)<br>
> > <br>
> > _______________________________________________<br>
> > erlang-questions mailing list<br>
> > <a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
> > <a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
> <br>
<br>
<br>
<br>
-- <br>
Wir haften nicht für die korrekte Funktion der in dieser eMail<br>
enthaltenen Viren. We are not liable for correct function of the<br>
viruses in this email! :)<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div>