2013-01-23 136 views
1

我需要一个函数,它将列出(列表项)并枚举每个列表中每个项目的所有可能组合。所以使用列表列表,将每个列表的每个元素与每个其他列表的每个元素相结合

someCombo :: [[a]] -> [[a]] 
someCombo = undefined 

如果我有这样的事情

[ 
[a1,b1], 
[a2,b2,c2], 
[a3,b3] 
] 

我想吐出这样的,其中每个列表的非常元素与所有其他列表中的每个元素相匹配的答案。大概在这种情况下,最终列表中会有12个元素。

[ 
    [a1,a2,a3],[a1,a2,b3],[a1,b2,a3],[a1,b2,b3],...,[b1,c2,b3] 
] 

主参数中可能有任意数量的列表。这看起来应该是非常简单的,但是我无法完全理解它。我可以做到两个或三个列表,但我不能使它递归地工作任意数量的列表。哦,我不关心结果列表的顺序,只要我有全部12个(或其他)。

如果有人很好奇这是什么,这是我需要实施一个算法的最后一部分,该算法决定了在每次电梯之前将板放到杠铃上的顺序,这样可以最大限度地减少我将要做的平板洗牌数量锻炼身体锻炼。我想这可能会为我节省几分钟的锻炼时间。为了做到这一点,我需要列举所有可能的锻炼,这些锻炼涉及每个电梯的一组特定板,然后查找每个电梯的板顺序的组合,从而导致最少的混洗。

+0

你想谷歌“笛卡尔”或“外部产品” –

回答

9
import Control.Monad 

someCombo = sequence 

让我们试一下:

>>> someCombo [[1, 2], [3, 4]] 
[[1,3],[1,4],[2,3],[2,4]] 

要理解这一点,你需要了解列表理解或列表单子。 sequence有效地做到这一点:

sequence [[1, 2], [3, 4]] 
= do x <- [1, 2] 
    y <- [3, 4] 
    return [x, y] 

你能想到的话说:“让x范围在1和2,让y范围超过3和4,现在返回xy所有排列”。

+0

枪的儿子。我知道我之前看过类似的东西。我会在让我回答这个问题的时候接受。 –

相关问题