我需要一个能够获取(项目列表)列表的函数,并枚举每个列表中每个项目的所有可能组合。所以
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 :(得分: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}的所有排列}”。