Haskell:如何使用任意数量的列表生成所有可能的元素组合,每个元素来自一个列表

Haskell:如何使用任意数量的列表生成所有可能的元素组合,每个元素来自一个列表,haskell,functional-programming,combinations,Haskell,Functional Programming,Combinations,有一个[“p”、“Q”、“R”…]列表,我想生成所有可能的[(String,Bool)]列表,其中左侧是第一个数组中的字母,右侧是True或False。例如,我想获得[“P”,“Q”] : 我这样做是为了我只有[“p”,“Q”]但我需要支持任意数量的字母。我认为我可以为每个字母L生成两对数组,就像[(L,True),(L,False)]一样,然后对每个字母都这样做,并使用每个数组中的一个元素对这些数组进行所有可能的组合,但我不知道如何正确地进行 这就是我为长度为2的字母列表所做的 envs ::

有一个
[“p”、“Q”、“R”…]
列表,我想生成所有可能的
[(String,Bool)]
列表,其中左侧是第一个数组中的字母,右侧是
True
False
。例如,我想获得
[“P”,“Q”]

我这样做是为了我只有
[“p”,“Q”]
但我需要支持任意数量的字母。我认为我可以为每个字母L生成两对数组,就像
[(L,True),(L,False)]
一样,然后对每个字母都这样做,并使用每个数组中的一个元素对这些数组进行所有可能的组合,但我不知道如何正确地进行

这就是我为长度为2的字母列表所做的

envs :: [String] -> [[(String, Bool)]]
envs predicate = let 
  env = [(p,b) | p <- predicate, b <- [True, False]]
  ps = filter (\(pred,val) -> pred == "P") env 
  qs = filter (\(pred,val) -> pred == "Q") env 
  in [[a,b] | a <- ps, b <- qs]
envs::[String]->[[(String,Bool)]]
envs谓词=let
环境=[(p,b)| p pred==“Q”)环境

在[[a,b]|a中引入此函数

cartProdn :: [a] -> Int -> [[a]]
cartProdn ls 2 = [[x, y] | x <- ls, y <- ls]
cartProdn ls n = [x : t | x <- ls, t <- cartProdn ls (n - 1)]

注意:您可能需要编写
ls=“PQR”

如果您有一个递归调用的结果列表[((“p”,False),(“Q”,True)],…],那么您需要做什么才能为新变量“Q”创建一个新的结果列表?您需要将结果列表中的每个现有列表加倍,一次为R为false,一次为R为True,就像charm一样工作!谢谢:)
*Main> ls = ["P", "Q", "R"]
*Main> rs = [zip ls c | c <- cartProdn [True, False] (length ls)]
*Main> putStrLn $ unlines $ map show rs
[("P",True),("Q",True),("R",True)]
[("P",True),("Q",True),("R",False)]
[("P",True),("Q",False),("R",True)]
[("P",True),("Q",False),("R",False)]
[("P",False),("Q",True),("R",True)]
[("P",False),("Q",True),("R",False)]
[("P",False),("Q",False),("R",True)]
[("P",False),("Q",False),("R",False)]