带重复的haskell组合

带重复的haskell组合,haskell,Haskell,以下是我的函数,它为给定集合中的k个项目生成所有组合: combR :: [t] -> Int -> [[t]] combR _ 0 = [ [] ] combR [] k = [] combR (x:xs) k = combR xs k ++ [x:t | t <- combR xs (k-1) ] combR::[t]>Int->[[t]] 梳0=[]] 梳[]k=[] combR(x:xs)k=combR xs k++[x:t|t您可以为列表创建一个包含两个元组的列表,

以下是我的函数,它为给定集合中的k个项目生成所有组合:

combR :: [t] -> Int -> [[t]]
combR _ 0 = [ [] ]
combR [] k = []
combR (x:xs) k = combR xs k ++ [x:t | t <- combR xs (k-1) ]
combR::[t]>Int->[[t]]
梳0=[]]
梳[]k=[]

combR(x:xs)k=combR xs k++[x:t|t您可以为列表创建一个包含两个元组的列表,其中
x
是从列表中“弹出”的元素:

import Control.Arrow(second)

pickOne :: [a] -> [(a, [a])]
pickOne [] = []
pickOne (x:xs) = (x, xs) : map (second (x:)) (pickOne xs)
因此,这给了我们:

Prelude> pickOne [1,4,2,5]
[(1,[4,2,5]),(4,[1,2,5]),(2,[1,4,5]),(5,[1,4,2])]
因此,在每个2元组中,第一个元素是我们从给定列表中选择的元素,第二个项目是剩余元素的列表

我们可以在列表理解表达式中使用该表达式,从而选择其中一个元素,并在剩余选项列表上递归:

combR :: [t] -> Int -> [[t]]
combR _ 0 = [[]]
combR l k = [ x:xs | (x, rs) <- pickOne l, xs <- combR rs (k-1)]
你的
[x:t | t当你说“带重复”时,我希望预期的输出也应该包括
[0,0],[1,1],…
,但显然你只想要非重复列表的所有排列。也许“带重复”在这里不是正确的术语。
Prelude Control.Arrow> combR [0,1,2] 2
[[0,1],[0,2],[1,0],[1,2],[2,0],[2,1]]
Prelude Control.Arrow> combR [1,4,2,5] 2
[[1,4],[1,2],[1,5],[4,1],[4,2],[4,5],[2,1],[2,4],[2,5],[5,1],[5,4],[5,2]]
Prelude Control.Arrow> combR [1,4,2,5] 3
[[1,4,2],[1,4,5],[1,2,4],[1,2,5],[1,5,4],[1,5,2],[4,1,2],[4,1,5],[4,2,1],[4,2,5],[4,5,1],[4,5,2],[2,1,4],[2,1,5],[2,4,1],[2,4,5],[2,5,1],[2,5,4],[5,1,4],[5,1,2],[5,4,1],[5,4,2],[5,2,1],[5,2,4]]
Prelude Control.Arrow> combR [1,4,2,5] 4
[[1,4,2,5],[1,4,5,2],[1,2,4,5],[1,2,5,4],[1,5,4,2],[1,5,2,4],[4,1,2,5],[4,1,5,2],[4,2,1,5],[4,2,5,1],[4,5,1,2],[4,5,2,1],[2,1,4,5],[2,1,5,4],[2,4,1,5],[2,4,5,1],[2,5,1,4],[2,5,4,1],[5,1,4,2],[5,1,2,4],[5,4,1,2],[5,4,2,1],[5,2,1,4],[5,2,4,1]]
Prelude Control.Arrow> combR [1,4,2,5] 1
[[1],[4],[2],[5]]