2013-01-23 132 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

槍的兒子。我知道我之前看過類似的東西。我會在讓我回答這個問題的時候接受。 –

相關問題