我需要获得列表元素的所有可能组合。我尝试了解决方案here,但它没有编译。请帮我解决这个问题:
subseq :: [a] -> [[a]]
subseq [] = []
subseq (x:xs) = map (x :) $ subseq xs
基本上这是subsequences
中Data.List
函数的重写。我不明白source中的版本。我在上面这个函数背后的理由就是这个。
在所有元素中应用cons运算符。这应该产生非确定性结果。但是,我得到的结果是一个空列表。请帮忙。
答案 0 :(得分:6)
让我们从基础案例开始。空集的幂集是包含空集的集合。因此,您需要将subseq [] = []
替换为subseq [] = [[]]
。现在你说的是空集的权力是空的,事实并非如此。
你的另一个案例也遗漏了。您需要将其更改为subseq (x:xs) = (subseq xs) ++ map (x :) (subseq xs)
。简单来说,这意味着您可以获取不包含第一项(subseq xs
)的子集以及包含它的子集(map (x :) (subseq xs)
)。
如果省略(subseq xs)
部分,你得到的只是一个只包含原始列表的列表,因为你只考虑了每个元素的子列表。
答案 1 :(得分:0)
您还可以使用Control.Monad中的filterM :: Applicative m => (a -> m Bool) -> [a] -> m [a]
函数来完成此任务。
在这种特殊情况下,我们的monad是list,因此我们需要类型(a -> m Bool)
的过滤函数,该函数返回布尔值列表。可能是\x -> [True, False]
,并且list的monad实例将确定性地将它们应用于所提供列表的每个元素,并生成列表列表。
Prelude> Control.Monad.filterM (\n -> [True, False]) [1,2,3]
[[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[]]