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.
- 没有得到所有的家庭作业问题很好。无论如何,11 个中有 10 个是伟大的工作!你会通过自己给它最好的机会来学习最好的,然后看看答案是什么,我相信他们会在类上复习。
-
您是否尝试过查看不使用列表理解的解决方案之一并将其转换为这样做?即使您不完全自己实现幂集算法,您也可能会学到很多东西。
使用直接递归和列表推导:
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 |
-
@WillNess我这样做是为了让它工作,但如果你的建议可以减少冗余,请随时编辑它。
-
你确定它在工作吗?它不适合我:lpaste.net/199034。 Set 是什么?
-
尝试更新的解决方案@WillNess 另外:输入 Set a = [a]
-
现在好啦。 -- 它也是 [r | ps<-powerset xs, r<-[(x:ps),ps]],供您娱乐;但是您的版本可能会减少内存消耗。
好的,这是我的提示:
如果您查看类似 (x:xs) 的内容,您现在可以选择是否将 x 包含在您的子集中。
不知何故必须同时使用这两种选择(可能与 (++) ;))...
现在记住其他提示(递归 ... xs ....),如果您考虑 [x:ys | ys <- ...]
,也许您会有所了解
顺便说一句:这几乎是作弊,但如果你找到了一个使用 do 表示法的解决方案:这真的很容易转化为列表推导式 ;) - 也许你可以发布一下你的进度?
- 实际上,我正在分析从我们的班级论坛获得的以下解决方案,但我不知道 f = (:) x 是什么意思,您能解释一下吗?我完全理解其余代码: powerSet (x:xs) = map f p p where p = powerSet xs f = (:) x powerSet [] = [[]]
-
@user3059248 是的,我可以: (:) x = \\ys -> [ x:y | y <- ys] - 请参阅 (:) 是您已经从列表中知道的 cons 运算符: (:) x xs = x:xs 甚至还有一种更容易理解的语法(称为部分): (:) x = (x:)
文字说"使用直接递归"。因此,当您需要计算 subsets (x:xs) 时,您可以从将 subsets xs 视为递归调用开始。有没有办法将 xs 的子集变成 x:xs 的子集,也许使用列表推导?