2

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

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]
]

main 参数中可以有任意数量的列表。这看起来应该很简单,但我无法完全理解它。我可以为两个或三个列表做这件事,但我不能让它递归地工作任意数量的列表。哦,我不在乎结果列表的顺序,只要我拥有全部 12 个(或其他)。

如果有人好奇这是为了什么,这是我需要实现的最后一块算法,该算法确定我在每次举重之前将盘子放在杠铃上的顺序,这将最大限度地减少我在每次锻炼中所做的盘子洗牌量。我认为这可能会为我每次锻炼节省几分钟。为了做到这一点,我需要列举所有可能的训练,这些训练涉及每次升降机的一组特定盘子,然后找到每个升降机的盘子顺序组合,从而导致最少的改组。

4

1 回答 1

12
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,让范围超过 3 和 4,现在返回和y的所有排列”。xy

于 2013-01-23T03:18:43.667 回答