Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么Data.Set没有电源集功能?_Haskell_Powerset - Fatal编程技术网

Haskell 为什么Data.Set没有电源集功能?

Haskell 为什么Data.Set没有电源集功能?,haskell,powerset,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]] powerLi

我正在查看
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)

有趣的是,前几天我在Haskell中实现了
powerset
,只是为了好玩


正如卡姆坎在其上述评论中所描述的那样
Set
的快速
union
应该比列表版本提高速度。

它不是一个非常常用的函数。我认为有趣的是,如果我们可以利用
Set
的特殊属性编写一些比简单解决方案更有效的东西。但我认为这样的事情并不容易。由于Set是严格的,而且powerSet会生成2^n个元素,因此,即使您尽可能提高效率,您也不会从这些优化中获得很多好处。@sclv:Set上的
Ord
实例是元素排序列表中的字典顺序。构造幂集时,首先移除最小的元素
x
,然后取剩余元素的幂集,得到
y
y
的每个元素都将大于
map(insert x)y
的每个元素。请注意,这可能比访问
Set
内部的算法效率更低。我认为,表示法是一个平衡的二叉树,这里的并集将始终是两个大小相等的集合,所有元素都大于/小于另一个的所有元素,因此仅求和大小就足够了,并以两个集合作为分支生成一个新的根。@camccann这是真的。我很想看到这样一个实现,并对其效率进行分析。此外,该算法可能会做不必要的工作,从内部集合中删除和插入元素。由于只使用了最少的元素,因此可能有一些快捷方式可用于避免中间步骤中的某些再平衡。无论如何,如果还没有对此进行分析,我会感到惊讶,因为功率集和平衡二叉树并不完全是模糊的概念。出于好奇,这比
map Data.Set.fromAscList更有效吗。filterM(常数[False,True])。Data.Set.toList
?如果要枚举
2^n
子集,为什么不让列表完成繁重的工作呢?你失去了分享(在很大程度上!),但这是我能想到的唯一的消极因素。@MarcoS:如果不询问实施者,这种问题很难回答,但可能是因为augustss间接指出的一点:权力集的规模呈指数增长,这使得一个非常狭窄的输入范围变得昂贵,足以考虑效率,但却便宜得足以进行计算。
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