Haskell:如何生成元素的所有可能组合,列表中的每个元素具有任意数量的列表

时间:2019-01-10 16:20:54

标签: haskell functional-programming combinations

有一个["P", "Q", "R" ...]的列表,我想生成[(String, Bool)]的所有可能列表,其中左边是第一个数组的字母,右边是True或{{ 1}}。例如,我想获得False["P", "Q"]

在只有[[("P",True),("Q",True)],[("P",True),("Q",False)],[("P",False),("Q",True)],[("P",False),("Q",False)]]的情况下我做到了,但是我需要支持任意数量的字母。我可以为每个字母L生成["P", "Q"]这样的数组中的两对,然后为每个字母生成该对,并使用每个数组中的一个元素对这些数组进行所有可能的组合,但是我不知道该怎么做正确。

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

[(L,True),(L,False)]

1 个答案:

答案 0 :(得分:2)

介绍此功能

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)]

这给出了一个有限列表(n)的长度n > 1的所有可能组合。

然后做

*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)]

注释:您可能想写ls = "PQR"