2016-02-05 35 views
1

我想要写在Haskell一个幂函数的函数声明:哈斯克尔Powerset的字母排序,

powerset :: Ord a => [a] -> [[a]] 

不过,我试图与一个字典序使:

powerset [1,2,3] = [[], [1], [1,2], [1,2,3], [1,3], [2], [2,3], [3]] 

我发现做幂的其他方式,如:

powerSet = filterM (const [True, False]) 

,但没有提供宝我们按字典顺序排列。有没有办法编写powerset函数来提供这个功能,或者将未排序的powerset排序到这个顺序中?

+1

你能不能组成[sortBy( http://hackage.haskell.org/package/base-4.8.2.0/docs/Data-List.html#v:sortBy)?不是最有效的方式,但应该做的伎俩。 – Mephy

回答

3

你可以做一个正确的方面:

powerset :: Foldable t => t a -> [[a]] 
powerset xs = []: foldr go [] xs 
    where go x acc = [x]: fmap (x:) acC++ acc 

则:

\> powerset [1, 2] 
[[],[1],[1,2],[2]] 
\> powerset [1, 2, 3] 
[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]] 

(编辑答案删除调用tail功能)

+0

这会如何处理大的结果?如果你问头部。最后。 powerset $ [1..25]',这需要多长时间? – dfeuer

+0

@dfeuer这个问题似乎在你没有任何进一步的工作由答复作家你可以负责。 –

+0

@DanielWagner,这通常是真的,但我最早一直到星期一晚上才离开我的笔记本电脑,而且我非常不耐烦。 – dfeuer