在Haskell中具有列表理解的集合的Powerset

时间:2015-09-14 23:54:52

标签: haskell recursion list-comprehension powerset

我是Haskell的初学者,我有11个练习作业,其中10个我已经解决了。我找到了几个解决方案来获取集合的powerset,但它们都没有包含列表理解。我知道在这种情况下我不应该要求一个完整的答案(因为这是家庭作业)但我非常感谢任何反馈/线索。

  

集合 S 的powerset是一个包含 S 的所有子集的集合。编写一个递归函数powerset,它返回一个包含给定集合的所有子集的集合。使用直接递归和列表理解。

3 个答案:

答案 0 :(得分:4)

好的,这是我的提示:

如果您查看(x:xs)之类的内容,您现在可以选择在您的子集中包含 x

不知何故必须使用两种选择(可能与(++);))...

现在记住其他提示(递归...... xs ....)如果您考虑[x:ys | ys <- ...]

,也许您会有所了解 顺便说一下:这几乎是作弊但是如果你找到一个使用do符号的解决方案:这很容易转化为列表推导;) - 也许你可以稍微发布你的进度?

答案 1 :(得分:3)

使用直接递归和列表理解:

type Set a = [a]

powerset :: Set a -> Set (Set a)
powerset [] = [[]]
powerset (x:xs) = [x:ps | ps <- powerset xs] ++ powerset xs

答案 2 :(得分:1)

文字说“使用直接递归”。因此,当您需要计算subsets (x:xs)时,您可以将subsets xs视为递归调用。有没有办法将xs的子集转换为x:xs的子集,可能使用列表推导?