你想要做的是获得所有组合True
and False
对于名称的数量,这可以轻松完成replicateM
专门用于列表:
replicateM (length names) [False, True]
E.g. if length names == 2
,那么这会产生:
[ [False, False]
, [False, True]
, [True, False]
, [True, True]
]
剩下的就是用名称本身压缩每个文件:
envs names =
[ zip names values
| let n = length names
, values <- replicateM n [False, True]
]
For envs ["P", "Q"]
这会产生:
[ [("P", False), ("Q", False)]
, [("P", False), ("Q", True)]
, [("P", True), ("Q", False)]
, [("P", True), ("Q", True)]
]
And it works for any number of inputs, even 0, for which your original implementation would fail since you don’t match []
. It always returns 2n assignments:
-- 2^0 == 1
envs [] == [[]]
-- 2^3 == 8
envs ["P", "Q", "R"] ==
[ [("P", False), ("Q", False), ("R", False)]
, [("P", False), ("Q", False), ("R", True)]
, [("P", False), ("Q", True), ("R", False)]
, [("P", False), ("Q", True), ("R", True)]
, [("P", True), ("Q", False), ("R", False)]
, [("P", True), ("Q", False), ("R", True)]
, [("P", True), ("Q", True), ("R", False)]
, [("P", True), ("Q", True), ("R", True)]
]