我正在查看Data.Set
,我发现它没有powerset
功能。为什么呢?
我可以像这样实现它:
import Data.Set (Set, empty, fromList, toList, insert)
powerset :: (Ord a) => Set a -> Set (Set a)
powerset s = fromList $ map (fromList) (powerList $ toList s)
powerList :: [a] -> [[a]]
powerList [] = [[]]
powerList (x:xs) = powerList xs ++ map (x:) (powerList xs)
但这似乎不是最有效的方式。好的,我也可以写
powerList :: [a] -> [[a]]
powerList = filterM (const [True, False])
但我仍然想知道为什么Data.Set
没有powerset
功能。
另外,写powerset :: (Ord a) => Set a -> Set (Set a)
的最佳方式是什么?
答案 0 :(得分:12)
好笑,前几天我实际在Haskell中实现了powerset
只是为了在a comment at /r/python中获得乐趣。
import Data.Set
import Prelude hiding (map)
powerset s
| s == empty = singleton empty
| otherwise = map (insert x) pxs `union` pxs
where (x, xs) = deleteFindMin s
pxs = powerset xs
就像他上面的评论中描述的那样。 Set
的快union
应该比列表版本提高速度。