我有一个函数“子集”,它生成给定集合的所有子集:
subsets :: [Int] -> [[Int]]
subsets [] = [[]]
subsets (x:xs) = subsets xs ++ map (x:) (subsets xs)
如何在另一个函数中组合 map、foldl 和 filter 以返回所有元素总和为 0 的子集?
**例子: **
set = [1,-1,5,2,-2,3]
result = [[1,-1],[2,-2],[-1,-2,3]]
最佳答案
你已经有子集了。所以我们需要一个函数
filterSubs :: [[Int]] -> [[Int]]
filterSubs = --remove all subsets which don't sum to 0
所以接下来我们需要一个谓词
sumZero :: [Int] -> Bool
sumZero xs = sum xs == 0
现在,使用这个和
filter
易于构建filterSubs
.我会把这个留给你来弄清楚它是如何工作的。然后我们的解决方案是微不足道的zeroSubs = filterSubs . subsets
关于Haskell 生成子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772427/