为什么Data.Set没有powerset功能?

时间:2011-06-21 15:53:27

标签: haskell powerset

我正在查看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)的最佳方式是什么?

1 个答案:

答案 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应该比列表版本提高速度。