Haskell:组合(列表清单)

时间:2017-12-09 15:01:57

标签: haskell functional-programming

我有一个主题列表和工作日,主题是教授的。

subjectDays = [("maths", ["mon", "tue"]),
               ("science", ["mon", "wed"])]

现在我想生成一个组合列表。 结果应如下所示。

combinations = [[("maths", "mon"), ("science", "mon")],
                [("maths", "mon"), ("science", "wed")]
                -- etc.
               ]

有人可以帮我在 Haskell 中编写一个函数来产生上述结果吗?

非常感谢你。

2 个答案:

答案 0 :(得分:4)

从下面的评论中,我现在意识到你想要的输出不是我最初理解的输出。

基本上,您希望每个子列表包含每个主题(只需一次),并与其中一个日期配对。如果我们仍按以下定义combinations(“错误”输出),我们意识到我们想要获取combinations内所有列表的“笛卡尔积”。可以使用Control.Monad.sequence获得此笛卡尔积。

wantedCombinations = sequence combinations

这是一个提示。

首先,编写一个函数将一对你的扩展为一个列表。

combs :: (a,[b]) -> [(a,b)]
combs (subject, days) = ...

例如,可以使用列表推导来解决这个问题。或map

然后,我们可以将combs应用于列表中的每一对

combinations = map combs subjectDays

答案 1 :(得分:0)

编写扩展函数以处理单对

expand :: (a,[b]) -> [(a,b)]
expand (x,[]) = []
expand (x,(y:ys)) = (x,y): expand (x,ys)

映射到您的结构并进行转置(Data.List)

transpose $ map expand subjectDays