关于递归:Haskell 中具有列表理解的集合的幂集

Powerset of a set with list comprehension in Haskell

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

The powerset of set S is a set containing all subsets of S. Write a recursive function powerset that returns a set containing all subsets of a given set. Use direct recursion and list comprehension.


使用直接递归和列表推导:

1
2
3
4
5
type Set a = [a]

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


好的,这是我的提示:

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

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

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

,也许您会有所了解

顺便说一句:这几乎是作弊,但如果你找到了一个使用 do 表示法的解决方案:这真的很容易转化为列表推导式 ;) - 也许你可以发布一下你的进度?


文字说"使用直接递归"。因此,当您需要计算 subsets (x:xs) 时,您可以从将 subsets xs 视为递归调用开始。有没有办法将 xs 的子集变成 x:xs 的子集,也许使用列表推导?