【发布时间】:2015-06-25 00:23:54
【问题描述】:
我正试图绕着haskell 中的列表单子低头。我试图在给定一个指定布尔变量的字符串列表的情况下生成所有可能命题的列表。
例如调用:
mapM_ print $ allPropositions ["a","b"]
会产生以下结果:
[("a",True),("b",True)]
[("a",True),("b",False)]
[("a",False),("b",True)]
[("a",False),("b",False)]
我已经设法通过以下代码使用列表推导和递归来做到这一点
allPropositions :: [String] -> [[(String,Bool)]]
allPropositions [] = [[]]
allPropositions (x:xs) = [(x,True):r | r <- allPropositions xs] ++ [(x,False):r | r <- allPropositions xs]
我正在寻找一种方法来使用类似于以下 sn-p 的 do 表示法,但输入数量可变。有没有办法做到这一点(嵌套单子,...)?
allPropositions' = do
a <- [True, False]
b <- [True, False]
return([("a",a),("b",b)])
【问题讨论】:
标签: list haskell list-comprehension monads