我是 Haskell 的完整初学者,我有 11 个作业练习,其中 10 个我已经解决了。我找到了几种获得集合的幂集的解决方案,但没有一个包括列表理解。我知道在这种情况下我不应该要求一个完整的答案(因为这是家庭作业),但我非常感谢任何反馈/线索。
集合S的幂集是包含S的所有子集的集合。编写一个递归函数
powerset
,返回一个包含给定集合的所有子集的集合。使用直接递归和列表推导。
我是 Haskell 的完整初学者,我有 11 个作业练习,其中 10 个我已经解决了。我找到了几种获得集合的幂集的解决方案,但没有一个包括列表理解。我知道在这种情况下我不应该要求一个完整的答案(因为这是家庭作业),但我非常感谢任何反馈/线索。
集合S的幂集是包含S的所有子集的集合。编写一个递归函数
powerset
,返回一个包含给定集合的所有子集的集合。使用直接递归和列表推导。
使用直接递归和列表推导:
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
也许使用列表推导?