Haskell生成子集

ori*_*ion 5 haskell subset-sum

我有一个函数'子集',它生成给定集的所有子集:

subsets :: [Int] -> [[Int]]
subsets []  = [[]]
subsets (x:xs) = subsets xs ++ map (x:) (subsets xs)
Run Code Online (Sandbox Code Playgroud)

如何在另一个函数中组合map,foldl和filter以返回包含总和为0的元素的所有子集?

**示例:**

set    = [1,-1,5,2,-2,3]
result = [[1,-1],[2,-2],[-1,-2,3]]
Run Code Online (Sandbox Code Playgroud)

Dan*_*zer 5

你已经有了子集.所以我们需要一个功能

filterSubs :: [[Int]] -> [[Int]]
filterSubs = --remove all subsets which don't sum to 0
Run Code Online (Sandbox Code Playgroud)

接下来我们需要一个谓词

sumZero :: [Int] -> Bool
sumZero xs = sum xs == 0
Run Code Online (Sandbox Code Playgroud)

现在,使用它,filter它很容易构建filterSubs.我将把这个留给你,弄清楚它是如何工作的.然后我们的解决方案是微不足道的

zeroSubs = filterSubs . subsets
Run Code Online (Sandbox Code Playgroud)