[Haskell-cafe] I need a hint in list processing

Richard O'Keefe ok at cs.otago.ac.nz
Sun Jun 14 23:38:44 EDT 2009

On 14 Jun 2009, at 8:06 pm, Fernan Bolando wrote:

> Hi all
> If I have a number of list
> example
> list1 = [2,3]
> list2 = [1,2]
> list3 = [2,3,4]
> list4 = [1,2,3]
> I want to create a list from the list above with n elements,
> non-repeating and each elements index represents 1 of the elements
> from the corresponding list so for the above input I would get.
> a = [3,2,4,1]

I have been staring at this off and on all day,
and I haven't the faintest idea what you want.

What is "n".  What is it that doesn't repeat?
How does the index of an element represent 1 element?
Which list corresponds to what?

I'm beginning to suspect that what you want is a "choice"
     f [s1,...,sn] = [x1,...,xn]
when each xi is an element of the corresponding si
and no two xs are the same.

Instead of finding one answer, let's find them all.

all_choices :: Eq a => [[a]] -> [[a]]
all_choices [] = [[]]
all_choices (set:sets) =
   [x:xs | xs <- all_choices sets, x  <- set, not(x `elem` xs)]

The test case

     all_choices [[2,3], [1,2], [2,3,4], [1,2,3]]

has the answer

     [[3,2,4,1], [3,1,4,2], [2,1,4,3]]

and you probably want to use it something like

     case all_choices sets of
       [] -> there are no such choices
       (first_choice:_) -> first_choice is one such choice

For inputs like [[1,2],[2,1],[1]] there is of course no such
choice function.

More information about the Haskell-Cafe mailing list