有一个["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)]
答案 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"
。