Hi Cafe!<br><br>I am struggling with an interesting problem while defining a function. It looks quite easy to me, but I couldn&#39;t manage to have a proper implementation yet.<br>To illustrate what I&#39;m trying to achive, I&#39;ll introduce special cases of the desired function, and hopefully build towards a solution step by step.<br>
<br><span style="font-family: courier new,monospace;">-- simplest case, taking 2 lists as parameters and returning a list of list containing every possible pair (but represented as lists)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">allPossibilities2 :: [a] -&gt; [a] -&gt; [[a]]</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">allPossibilities2 listX listY = [ [x,y] |</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    x &lt;- listX,</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    y &lt;- listY]</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">-- sample output</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">-- allPossibilities2 [1,2,3] [7,8,9]</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">-- [[1,7],[1,8],[1,9],[2,7],[2,8],[2,9],[3,7],[3,8],[3,9]]</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">-- simplest case with 3 parameters instead of 2</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">allPossibilities3 :: [a] -&gt; [a] -&gt; [a] -&gt; [[a]]</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">allPossibilities3 listX listY listZ = [ [x,y,z] |</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    x &lt;- listX,</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    y &lt;- listY,</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    z &lt;- listZ]</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">-- allPossibilities3 [1,2] [3,4,5] [6,7]</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">-- [[1,3,6],[1,3,7],[1,4,6],[1,4,7],[1,5,6],[1,5,7],[2,3,6],[2,3,7],[2,4,6],[2,4,7],[2,5,6],[2,5,7]]</span><br>
<br><br>These are easy and work just fine. All I want to do is to generalize this function receiving n lists as parameters and doing the simple action described above. Since I cannot pass variable number of parameters to a function, I&#39;ll use list of lists from now on.<br>
Following are the implementations of the same functions with different types (instead of two lists, a list of lists assumed to caontain those 2 elements)<br><br><span style="font-family: courier new,monospace;">allPossibilities2&#39; :: [[a]] -&gt; [[a]]</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">allPossibilities2&#39; list = [ [x,y] |</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    x &lt;- list !! 0,</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    y &lt;- list !! 1]</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">-- allPossibilities2&#39; [[1,2,3],[7,8,9]]</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">-- [[1,7],[1,8],[1,9],[2,7],[2,8],[2,9],[3,7],[3,8],[3,9]]</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">allPossibilities3&#39; :: [[a]] -&gt; [[a]]</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">allPossibilities3&#39; list = [ [x,y,z] |</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    x &lt;- list !! 0,</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    y &lt;- list !! 1,</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    z &lt;- list !! 2]</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">-- allPossibilities3&#39; [[1,2],[3,4,5],[6,7]]</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">-- [[1,3,6],[1,3,7],[1,4,6],[1,4,7],[1,5,6],[1,5,7],[2,3,6],[2,3,7],[2,4,6],[2,4,7],[2,5,6],[2,5,7]]</span><br><br><br>This is ugly!<br><br>Anyway, just forget the fact that these funstions do not do a check on the length of the input list for a moment. My question is, how can I generalize this function to accept a list of lists of arbitrary length, and produce the required result.<br>
<br>I hope I managed to make my point clear enough. Waiting for suggestions.<br><br>Regards,<br clear="all"><br>-- <br>Ozgur Akgun<br>