我想使所有可能的子组与2个列表的组合。这里,不只是这一个功能:列表的排列--Haskell
getCombinations :: [a] -> [[a]]
getCombinations na = do
a <- na
b <- na
[[a,b]]
如果传递“ABC”这个功能,它返回:
["aa","ab","ac","ba","bb","bc","ca","cb","cc"]
同样的方法的简单修改可以返回的3所列出的组合而不是两个。通过“ABC”作为参数的
getCombinations :: [a] -> [[a]]
getCombinations na = do
a <- na
b <- na
c <- na
[[a,b,c]]
结果:
["aaa","aab","aac","aba","abb","abc","aca","acb","acc",
"baa","bab","bac","bba","bbb","bbc","bca","bcb","bcc",
"caa","cab","cac","cba","cbb","cbc","cca","ccb","ccc"]
什么让它扩展到列表中任意数量的最简单的方法?下面是类型声明应该是什么样子:
getCombinations :: Int -> [a] -> [[a]]
您可以随时尝试使用hoogle:http://www.haskell.org/hoogle/?hoogle=Int+-%3E+[a]+-%3E+[[a]],它会将replicateM作为第三个结果。 – sdcvvc 2012-01-08 18:00:34
谢谢sdcvvc,我不知道有可能像这样查询hoogle! – RooSoft 2012-01-08 18:16:42
从技术上讲,这些是[置换](https://en.wikipedia.org/wiki/Permutation)不是[组合](https://en.wikipedia.org/wiki/Combination)。数学家将是迂腐的... – 2014-01-22 23:48:24