代码之家  ›  专栏  ›  技术社区  ›  Eduard Valentin

Haskell:如何生成所有可能的元素组合,每个元素来自一个列表,具有任意数量的列表[重复]

  •  -1
  • Eduard Valentin  · 技术社区  · 7 年前

    有一份清单 ["P", "Q", "R" ...] 我想生成所有可能的 [(String, Bool)] True False ["P", "Q"] 我想获得 : [[("P",True),("Q",True)],[("P",True),("Q",False)],[("P",False),("Q",True)],[("P",False),("Q",False)]]

    我是为我只有一个 但我需要支持任意数量的字母。我认为我可以为每个字母L生成两对数组,如 [(L,True),(L,False)]

    envs :: [String] -> [[(String, Bool)]]
    envs predicate = let 
      env = [(p,b) | p <- predicate, b <- [True, False]]
      ps = filter (\(pred,val) -> pred == "P") env 
      qs = filter (\(pred,val) -> pred == "Q") env 
      in [[a,b] | a <- ps, b <- qs]
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Elmex80s    7 年前

    介绍这个功能

    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" .

    推荐文章