簡體   English   中英

Haskell函數:: [Name]-> [[((Name,Bool)]]

[英]Haskell function :: [Name] -> [[(Name, Bool)]]

給定以下內容:

type Name = String
envs :: [Name] -> [[(Name , Bool)]]

我必須實現“ envs”,以便給定名稱列表,它返回名稱和布爾值的所有可能組合

我的嘗試並未返回所有可能的組合,這是我的代碼:

envs xxs@(x:xs) = [[ (name, value) | name <- xxs  , value <- [False, True] ]]

的預期結果

envs ["P", "Q"]

是:

[ [ ("P",False)
  , ("Q",False)
  ]
, [ ("P",False)
  , ("Q",True)
  ]
, [ ("P",True)
  , ("Q",False)
  ]
, [ ("P",True)
  , ("Q",True)
  ]
]

但是,我的是:

[[("P",True),("Q",True)],[("P",False),("Q",False)]]

那么,“ envs”函數的正確實現是什么,即返回預期結果的函數呢?

你想要做的就是讓所有的組合TrueFalse了名的數量,它可以很容易地做到replicateM專門到列表:

replicateM (length names) [False, True]

例如,如果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]
  ]

對於envs ["P", "Q"]會產生:

[ [("P", False), ("Q", False)]
, [("P", False), ("Q", True)]
, [("P", True), ("Q", False)]
, [("P", True), ("Q", True)]
]

它適用於任意數量的輸入,甚至0,由於您不匹配[] ,您的原始實現可能會失敗。 它總是返回2 n個分配:

-- 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)]
  ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM