【发布时间】:2015-01-06 23:19:03
【问题描述】:
在 Haskell 中,当我输入一个有序数字列表时,如何创建一个包含数字和布尔值(真或假)的所有可能组合的列表?
例如
当我输入 [1,2]
输出是:
[ [(1,False),(2,False)]
, [(1,False),(2,True)]
, [(1,True),(2,False)]
, [(1,True), (2,True)] ]
【问题讨论】:
标签: haskell combinations
在 Haskell 中,当我输入一个有序数字列表时,如何创建一个包含数字和布尔值(真或假)的所有可能组合的列表?
例如
当我输入 [1,2]
输出是:
[ [(1,False),(2,False)]
, [(1,False),(2,True)]
, [(1,True),(2,False)]
, [(1,True), (2,True)] ]
【问题讨论】:
标签: haskell combinations
list monad 可能是最容易理解的:
f xs = do
bs <- replicateM (length xs) [False, True] -- Obtain |xs| elements from the set of all possible booleans
return (zip xs bs) -- Pair the elements of each list
结果是:
Prelude Control.Monad> f [1,2]
[[(1,False),(2,False)],[(1,False),(2,True)],[(1,True),(2,False)],[(1,True),(2,True)]]
【讨论】:
f = mapM (\x -> [(x, False), (x, True)])。
b1 n = sequence $ replicate n [False,True]
b2 xs = map (zip xs) (b1 (length xs))
例子:
*Main> b2 [1,2]
[[(1,False),(2,False)],[(1,False),(2,True)],[(1,True),(2,False)],[(1,True),(2,True)]]
【讨论】:
使用列表推导
[zip [1..] [x,y] | x<-[True,False], y<-[True,False]]
【讨论】: