【发布时间】:2020-05-01 16:52:33
【问题描述】:
我刚刚开始学习 Haskell,遇到了解决这个问题的困难时期:
powerSet :: Set a -> Set (Set a)
这是我的尝试:
powerSet :: Tree a -> Tree (Tree a)
powerSet Empty = Empty
powerSet tree = fromList' [fromList' p | p <- powerSet' (toList tree)]
powerSet' :: [a] -> [[a]]
powerSet' [] = [[]]
powerSet' (x:xs) = [x:ps | ps <- powerSet' xs] ++ powerSet' xs
我应该按这样的顺序输出:powerset {1,2,3} => { {}, {1}, {2}, {1,2,3}, {1,3}, {2}, {2,3}, {3} }
但是我得到了这个:powerset {1,2,3} => { {1,2,3}, {1,2}, {1,3}, {1}, {2,3}, {2}, {3}, {} }
有什么办法可以改变吗?
【问题讨论】:
-
为什么您希望订单是
{ {}, {1}, ... }? -
集合是无序的集合。很可能,您应该在打印元素时忽略它们的顺序。
-
您的实现还处理
Tree,而不是Set。 -
@WillemVanOnsem 值得一提的是,如果您将预期输出中的第一个
{2}更改为{1,2},则子集按字典顺序显示;所以也许这个练习是为了鼓励搜索树的实现。 -
@DanielWagner:是的。但是,
fromList应该因此以有序的方式插入项目。那么“责任”更多的是用于树生成部分而不是powerSet'函数。