使用列表列表,将每个列表的每个元素与每个其他列表的每个其他元素组合在一起

时间:2013-01-23 03:15:56

标签: list haskell combinations

我需要一个能够获取(项目列表)列表的函数,并枚举每个列表中每个项目的所有可能组合。所以

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个(或其他)它们。

如果有人对这是什么感到好奇,那么这是我需要实施一个算法的最后一个部分,它确定在每次升降之前我将板放到杠铃上的顺序是什么,这样可以最大限度地减少我从锻炼中做的平板洗牌量运动。我认为每次锻炼可能会节省几分钟。为了做到这一点,我需要列举所有可能的锻炼,其中涉及每个电梯的一组特定的板块,然后找到每个电梯的板块订单的组合,这导致最少量的洗牌。

1 个答案:

答案 0 :(得分:11)

import Control.Monad

someCombo = sequence

我们试一试:

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

要理解这一点,您需要了解列表推导或列表monad。 sequence有效地做到了这一点:

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

您可以将其视为“让x范围超过1和2,让y范围超过3和4,现在返回x和{{1}的所有排列}”。