<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">Should permutation of lists be in the list module or the random module?</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Hello "expression problem", how nice to see you again!</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">There are many different kinds of sequences, such as unrolled lists and</div><div class="gmail_default" style="font-family:monospace,monospace">AVL DAGs and paged/segmented arrays, and the concept of permutation</div><div class="gmail_default" style="font-family:monospace,monospace">applies to all of them.  It is too much to expect the random module to</div><div class="gmail_default" style="font-family:monospace,monospace">know about all of them.  Equally, you really don't want to couple</div><div class="gmail_default" style="font-family:monospace,monospace">everything in sight to the random module.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Also, there are many *ways* to scramble a sequence.</div><div class="gmail_default" style="font-family:monospace,monospace">Crack open a good combinatorics book and read about "The Twelvefold Way".</div><div class="gmail_default" style="font-family:monospace,monospace">There can also be weighted permutations, where each element has a given</div><div class="gmail_default" style="font-family:monospace,monospace">probability of being the first (or next), it's not just uniform.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">So we actually have a three-dimensional combination:</div><div class="gmail_default" style="font-family:monospace,monospace">  - what kind of data is to be scrambled?</div><div class="gmail_default" style="font-family:monospace,monospace">  - what method of scrambling is wanted?</div><div class="gmail_default" style="font-family:monospace,monospace">  - what is the source of random numbers?</div><div class="gmail_default" style="font-family:monospace,monospace">If I'm not mistaken, this is what multiparameter type classes are for.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">The solution would appear to be to provide a random module with a</div><div class="gmail_default" style="font-family:monospace,monospace">type<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 5 Sep 2019 at 23:09, Julien Fischer <<a href="mailto:jfischer@opturion.com">jfischer@opturion.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Hi Mark,<br>
<br>
On Thu, 5 Sep 2019, Mark Brown wrote:<br>
<br>
> On Thu, Sep 5, 2019 at 4:09 PM Julian Fondren <<a href="mailto:jfondren@minimaltype.com" target="_blank">jfondren@minimaltype.com</a>> wrote:<br>
>><br>
>> In the permute_array/permute_list future,<br>
>> will permute_X be added for other data structures?<br>
><br>
> I wasn't planning to. Permutation is (mathematically) usually only<br>
> defined for sets and sequences so I'm not sure what you'd be expecting<br>
> for other library types. I suppose there could be a set permutation<br>
> predicate that returns a randomly ordered list of the elements.<br>
><br>
> In my view, the reason to put them in the random module is that they<br>
> are more related to each other, and to the other predicates that do<br>
> random stuff, than they are to predicates that merely work on lists or<br>
> arrays. But no matter, I can add list.random_permutation now unless<br>
> anyone else wants to add their opinion?<br>
<br>
I disagree: I expect to find generic operations on lists in the list<br>
module and generic operations on arrays in the array module.<br>
<br>
> (array.random_permutation ought to wait until the old RNG has been<br>
> sufficiently obsoleted. Note that I have only obsoleted the<br>
> random.init predicate as that is sufficient to produce a warning, and<br>
> declaring all predicates of the old implementation to be obsolete<br>
> would only result in getting multiple warnings for essentially the<br>
> same issue. I'll make that clearer in the docs for random.init.)<br>
<br>
...<br>
<br>
> So what's the choice?<br>
><br>
> 1. Add random.permute_* (or whatever) now.<br>
> 2. Add list.random_permutation and make a backwards incompatible<br>
> change to array.random_permutation now.<br>
> 3. Add list.random_permutation now, but wait before changing<br>
> array.random_permutation.<br>
<br>
I think we could avoid the namespace issues by naming the new versions<br>
either:<br>
<br>
<br>
     random.shuffle_list<br>
     random.shuffle_array<br>
<br>
or:<br>
<br>
     list.random_shuffle<br>
     array.randome_suffle<br>
<br>
depending on where they end up (i.e. don't use the word permutation<br>
or permute.)<br>
<br>
We can always reclaim the name permutation after the old interface has<br>
been removed.<br>
<br>
Julien.<br>
_______________________________________________<br>
users mailing list<br>
<a href="mailto:users@lists.mercurylang.org" target="_blank">users@lists.mercurylang.org</a><br>
<a href="https://lists.mercurylang.org/listinfo/users" rel="noreferrer" target="_blank">https://lists.mercurylang.org/listinfo/users</a><br>
</blockquote></div>