Haskell 列表元素的所有可能组合

Haskell 列表元素的所有可能组合,haskell,Haskell,我需要得到列表元素的所有可能组合。我尝试了这个解决方案,但它无法编译。请帮我弄清楚这一点: subseq :: [a] -> [[a]] subseq [] = [] subseq (x:xs) = map (x :) $ subseq xs 基本上,这是对Data.List中的subsequences函数的重写。不过我不明白书中的版本。以上功能背后的基本原理如下 在所有元素上应用cons运算符。这将产生一个不确定的结果。然而,我得到的结果是一个空列表。请帮助。让我们从基本案例开始。空集

我需要得到列表元素的所有可能组合。我尝试了这个解决方案,但它无法编译。请帮我弄清楚这一点:

subseq :: [a] -> [[a]]
subseq [] = []
subseq (x:xs) = map (x :) $ subseq xs
基本上,这是对Data.List中的subsequences函数的重写。不过我不明白书中的版本。以上功能背后的基本原理如下


在所有元素上应用cons运算符。这将产生一个不确定的结果。然而,我得到的结果是一个空列表。请帮助。

让我们从基本案例开始。空集的功率集是包含空集的集。因此,您需要将subseq[]=[]替换为subseq[]=[[]]。现在你说空集的幂是空的,事实并非如此

你的另一个案子也漏掉了一些东西。您需要将其更改为subseq x:xs=subseq xs++map x:subseq xs。在简单的英语中,这意味着您获取不包含第一项subseq xs的子集以及包含它的子集映射x:subseq xs


如果省略了SuSEQ XS部分,你得到的是一个只包含原始列表的列表,因为你只考虑每个元素的子列表。

让我们从基本情况开始。空集的功率集是包含空集的集。因此,您需要将subseq[]=[]替换为subseq[]=[[]]。现在你说空集的幂是空的,事实并非如此

你的另一个案子也漏掉了一些东西。您需要将其更改为subseq x:xs=subseq xs++map x:subseq xs。在简单的英语中,这意味着您获取不包含第一项subseq xs的子集以及包含它的子集映射x:subseq xs


如果你省略了SuSEQ XS部分,你得到的是一个只包含原始列表的列表,因为你只考虑每个元素的子列表。

你也可以用FielTalm来完成这个任务:应用M= > A~>M BoOL>[A] -M[A]函数,它驻留在Simult.Maad中。 在这个特殊的例子中,我们的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],[]]

您还可以使用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],[]]

提示:如果我将一个操作映射到一个空列表上,结果的空值会减少多少?提示:如果我将一个操作映射到一个空列表上,结果的空值会减少多少?