我有一个主题列表和工作日,主题是教授的。
subjectDays = [("maths", ["mon", "tue"]),
("science", ["mon", "wed"])]
现在我想生成一个组合列表。 结果应如下所示。
combinations = [[("maths", "mon"), ("science", "mon")],
[("maths", "mon"), ("science", "wed")]
-- etc.
]
有人可以帮我在 Haskell 中编写一个函数来产生上述结果吗?
非常感谢你。
答案 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