列表元素的所有可能组合

时间:2016-06-12 20:47:19

标签: haskell

我需要获得列表元素的所有可能组合。我尝试了解决方案here,但它没有编译。请帮我解决这个问题:

subseq :: [a] -> [[a]]
subseq [] = []
subseq (x:xs) = map (x :) $ subseq xs

基本上这是subsequencesData.List函数的重写。我不明白source中的版本。我在上面这个函数背后的理由就是这个。

在所有元素中应用cons运算符。这应该产生非确定性结果。但是,我得到的结果是一个空列表。请帮忙。

2 个答案:

答案 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],[]]